【问题标题】:SQL On Duplicate Key Update - On A Non-Primary-Key?SQL 关于重复键更新 - 在非主键上?
【发布时间】:2015-09-28 13:10:45
【问题描述】:

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

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

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

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

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

提前致谢。

【问题讨论】:

  • ON DUPLICATE KEY UPDATE 是 mysql 原生表达式,你是在 mysql 还是 MS Sql server 中做这个?
  • INSERT INTO ..... ON DUPLICATE KEY UPDATE FIELDNAME =VALUE(Value);所以 VALUE() 从参数之间获取值,Value 是参数名称。
  • 如果您只使用 MySQL,请从您的问题中删除 sql-server 标签。
  • SQL Server Management Studio 中的@Uporabnik003
  • SQL Server Management Studio 用于不支持“ON DUPLICATE KEY UPDATE”命令的 Microsoft SQL Server,您将不得不另谋出路。

标签: mysql asp.net sql-server


【解决方案1】:

对于使用 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 来尝试插入和处理密钥违规通常会更好。

【讨论】:

  • 谢谢,这正是我想要的。如果您有任何关于如何处理密钥违规的良好指南,那么我会全神贯注。标记为答案:)
【解决方案2】:

试试这个,我没有表格或数据,所以可能有问题:

删除了无效的解决方案,@Remus Rusanu 解决方案是正确的。

注意表中的重复行,如果 CustomerId 和 FieldId 多于一行,MERGE 会报错。

【讨论】:

  • 这个 MERGE 使用同一个表作为源和目标是相当不正统的。
  • 啊,你是对的,如果我修复值 4 和 11,Src 表就没用了。将编辑它,你的解决方案有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 2015-03-20
  • 2013-12-13
  • 2012-02-17
  • 1970-01-01
  • 2019-07-20
  • 2019-06-19
相关资源
最近更新 更多