SQL重复密钥更新 - 在非主键上?

时间:2015-09-28 13:10:45

标签: mysql asp.net sql-server

编辑:任何人都可以解释我如何使用 MERGE 来解决这个问题?语法真让我困惑:https://technet.microsoft.com/en-us/library/bb522522(v=sql.105).aspx

我有一个名为dbo.Customers_DefaultValues的表,基本上如果客户忘记输入值,我会将数据库中的值设置为特定于该客户的默认值。

The database table

表中的键是Id。 FieldId并非每个客户都是唯一的,因此例如 CustomerId = 1 CustomerId = 2 都可以具有 FieldId = 11 。我想要做的是,如果我为已经有值的客户向FieldId添加新值 - 我想更新该值。

我已阅读并尝试使用 ON DUPLICATE KEY UPDATE ,但它一直给我错误。

enter image description here

有什么方法可以解决这个问题吗?

提前致谢。

2 个答案:

答案 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会给你错误。