假设一个表结构MyTable(KEY, datafield1, datafield2...).
通常我想要更新现有记录,或者如果新记录不存在则插入新记录.
实质上:
IF (key exists)
run update command
ELSE
run insert command
Run Code Online (Sandbox Code Playgroud)
写这个的最佳表现方式是什么?
数据库触发器是个坏主意吗?
根据我的经验,它们是邪恶的,因为它们可能导致令人惊讶的副作用,并且难以调试(特别是当一个触发器触发另一个触发器时).通常开发人员甚至不会考虑是否存在触发因素.
另一方面,似乎你必须FOO在数据库中创建一个新的逻辑,然后在数据库中创建一个新的最简单的地方是FOO表上的插入触发器.
我们唯一一次使用触发器就是设置简单的东西ModifiedDate.
在MySQL中,如果指定ON DUPLICATE KEY UPDATE且插入的行将导致UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行的UPDATE.例如,如果列a声明为UNIQUE并包含值1,则以下两个语句具有相同的效果:
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
UPDATE table SET c=c+1 WHERE a=1;
Run Code Online (Sandbox Code Playgroud)
我不相信我在T-SQL中遇到过类似的东西.SQL Server是否提供了与MySQL的ON DUPLICATE KEY UPDATE相当的东西?
我正在尝试使用此查询将一些模拟支付信息插入到dev数据库中:
INSERT
INTO
Payments(Amount)
VALUES(12.33)
WHERE
Payments.CustomerID = '145300';
Run Code Online (Sandbox Code Playgroud)
怎么能调整这个来执行?我也尝试过这样的事情:
IF NOT EXISTS(
SELECT
1
FROM
Payments
WHERE
Payments.CustomerID = '145300'
) INSERT
INTO
Payments(Amount)
VALUES(12.33);
Run Code Online (Sandbox Code Playgroud) 我目前有一个MySQL服务器,但目前正在迁移到MS SQL Server。
我试图在C#应用程序的表中每批插入很多(2000)或记录。我想复制MySQL的“ REPLACE INTO”(替换)(UPSERT),如果记录存在,我想更新它,如果记录不存在,我想插入它。我目前有一个这样的声明:
REPLACE INTO tablename (keycol, col1, col2)
VALUES ('A','B','C'),
('C','D','E'),
('F','G','H'),
('I','J','K');
Run Code Online (Sandbox Code Playgroud)
有些记录将存在,而另一些则不存在。另外,该语句将在许多不同的表上运行,并且值是在运行时构建的(通过动态循环遍历每个字段),因此在编译时表的结构未知。
我怀疑我是否可以有效地使用MERGE,因为该批次中的某些记录将存在而一些记录将不存在,并且由于我不知道事前的表格结构以及我正在更新批次的事实。 2000条记录,出于性能原因,我不想使用子查询。
最好的解决方案的任何帮助将不胜感激。
我想知道MERGE比简单地使用IF EXISTS有什么优势.建议的方法是哪种?MERGE是否执行更新和插入逐行匹配条件?如果是的话,它与游标类似吗?