当前位置: 首页 > 知识库问答 >
问题:

在重复的密钥更新不会更新,但会引发重复的错误

戚祺
2023-03-14

我有一个具有两列主键(key1,key2)的表。

INSERT INTO mytable (key1, key2, val1, val2) 
VALUES (:k1, :k2, :v1, :v2)
ON DUPLICATE KEY UPDATE val1 = val1 + :v1, val2 = val2 + :v2

未捕获的异常“PDOException”,包含消息“SQLSTATE[23000]”:完整性约束违反:1062中键“Primary”的重复项“157-433”...

为什么它不只是更新现有的(157,433)-行?

共有1个答案

田冥夜
2023-03-14

不能在查询中多次引用同一个占位符。MySQL对此有一个内置解决方案--如果在on DUPLICATE key子句中使用values(colname),它将引用如果它不是重复的就会存储在列中的值。所以使用:

INSERT INTO mytable (key1, key2, val1, val2)
VALUES (:k1, :k2, :v1, :v2)
ON DUPLICATE KEY UPDATE val1 = val1 + VALUES(val1), val2 = val2 + VALUES(val2)

不过,我不确定为什么它会导致创建重复条目的错误。

 类似资料:
  • 我试图在if语句中设置状态,但它不会这样做。结果,我需要从if语句中更新状态,在那个里我可以接收经度和纬度坐标,但它不会保存状态。若我在If语句之外的控制台中回显,我将只读取第一个setState值表单componentWillMount。有什么问题吗?我做错了什么?结构如下:

  • 问题内容: 在SQLAlchemy中有一种优雅的方法吗?我的意思是语法类似于? 问题答案: 现在,仅在MySQL的SQLAlchemy中内置了此功能。somada141的以下答案是最佳解决方案:https ://stackoverflow.com/a/48373874/319066 在SQL语句中 如果希望生成的SQL实际上包含,则最简单的方法涉及使用装饰器。 的代码(来自关于该主题的很好的螺纹连

  • 我基于以下示例实现了这一点:https://vladmihalcea.com/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate/

  • 如何使用选项编写原则查询?

  • 我找遍了,但没有找到是否可能。 我有一个MySQL查询: 字段id有一个“唯一索引”,所以不能有两个。现在,如果数据库中已经存在相同的id,我想更新它。但我真的必须再次指定所有这些字段吗,比如: 或: 我已经在插入中指定了所有内容。。。 一个额外的注意事项,我想使用周围的工作来获得ID! 我希望有人能告诉我什么是最有效的方法。

  • 问题内容: 我没有看到重复的约束。它在哪里? 问题答案: 这很可能是因为您至少命名了一个约束,且其标识符与列相同: 应该为约束使用其他标识符,例如: 和表中的相同: 这些是我看到的仅有的三个,但可能还有其他我想念的。