返回

MySQL联合主键`INSERT INTO ON DUPLICATE KEY UPDATE`失败的终极解决指南

mysql

MySQL联合主键INSERT INTO ON DUPLICATE KEY UPDATE失败的终极指南

问题:重复条目错误

在使用联合主键的MySQL表中执行INSERT INTO ON DUPLICATE KEY UPDATE时,您可能会遇到一个令人头疼的错误:"Duplicate entry 'value' for key 'PRIMARY'"。这是因为联合主键中的值必须是唯一的。

解决方案:指定实际值

要解决此问题,关键 是避免在VALUES子句中使用?占位符。相反,直接指定实际值 ,如下所示:

INSERT INTO db.entries (id, scenario, archive) VALUES ('14a80111-eaf6-4b58-8803-7ec10f6a61c9', '77bc657d-e81d-4ea8-8dbc-ce1', TRUE)
ON DUPLICATE KEY UPDATE
archive = VALUES(archive);

原因:误解ON DUPLICATE KEY UPDATE

当使用?占位符时,MySQL将ON DUPLICATE KEY UPDATE子句解释为INSERT操作的一部分,而不是单独的更新操作。这会导致MySQL尝试将新行插入表中,即使该行已经存在,从而引发重复条目错误。

示例:成功执行操作

让我们使用以下示例来说明如何成功执行INSERT INTO ON DUPLICATE KEY UPDATE操作:

CREATE TABLE IF NOT EXISTS db.entries (
  id VARCHAR(36) NOT NULL COMMENT 'UUID',
  scenario VARCHAR(36) NOT NULL COMMENT 'UUID',
  archive BOOLEAN NOT NULL DEFAULT FALSE,
  PRIMARY KEY (id, scenario)
);

INSERT INTO db.entries (id, scenario, archive) VALUES ('14a80111-eaf6-4b58-8803-7ec10f6a61c9', '77bc657d-e81d-4ea8-8dbc-ce1', TRUE)
ON DUPLICATE KEY UPDATE
archive = VALUES(archive);

注意事项

记住,VALUES子句中指定的值必须与ON DUPLICATE KEY UPDATE子句中指定的列匹配。否则,操作将失败。

总结

通过指定实际值,您可以绕过MySQL的解释错误,并确保ON DUPLICATE KEY UPDATE子句被正确执行。

常见问题解答

  1. 为什么不能使用?占位符?
    因为MySQL会将它们解释为INSERT操作的一部分,而不是更新操作。

  2. VALUES子句中的值必须与哪些列匹配?
    ON DUPLICATE KEY UPDATE子句中指定的列。

  3. 如果我指定不匹配的值怎么办?
    操作将失败,并返回一条错误消息。

  4. 使用实际值有什么好处?
    它确保MySQL正确解释ON DUPLICATE KEY UPDATE子句,并避免重复条目错误。

  5. 还有什么其他解决此问题的替代方法吗?
    除了指定实际值之外,还可以使用REPLACE INTO语句,它会覆盖现有行,而不是更新它。