编辑:任何人都可以解释我如何使用 MERGE 来解决这个问题?语法真让我困惑:https://technet.microsoft.com/en-us/library/bb522522(v=sql.105).aspx
我有一个名为dbo.Customers_DefaultValues的表,基本上如果客户忘记输入值,我会将数据库中的值设置为特定于该客户的默认值。
表中的键是Id。 FieldId并非每个客户都是唯一的,因此例如 CustomerId = 1 和 CustomerId = 2 都可以具有 FieldId = 11 。我想要做的是,如果我为已经有值的客户向FieldId添加新值 - 我想更新该值。
我已阅读并尝试使用 ON DUPLICATE KEY UPDATE ,但它一直给我错误。
有什么方法可以解决这个问题吗?
提前致谢。
答案 0 :(得分:3)
对于使用MERGE
的SQL Server:
MERGE dbo.Customers_DefaultValues AS target
USING (SELECT 4,11, 'Test2') AS source (CustomerId, FieldId, Value)
ON (target.CustomerId = source.CustomerId AND target.FieldId = source.FieldId)
WHEN MATCHED THEN
UPDATE SET value = source.value
WHEN NOT MATCHED THEN
INSERT (CustomerId, FieldId, Value)
VALUES source.CustomerId, Source.FieldId, Source.Calue
END;
实际上,通过执行更新since MERGE is actually not atomic来尝试插入和处理密钥违规通常会更好。
答案 1 :(得分:0)
试试这个,我没有表格或数据,所以可能会出现问题:
编辑出无效的解决方案,@ Remus Rusanu解决方案是正确的。
注意表中的重复行,如果CustomerId和FieldId有多行,MERGE会给你错误。