更新中的自动增量值与内部生成的值冲突

auto-increment value in update conflicts with internally generated values

我不时从 MYSQL 中的重复更新查询插入中随机收到此错误。 知道发生了什么事吗?我似乎无法始终如一地重现错误,它有时会发生,有时却不会。

这里是有问题的查询:

INSERT INTO friendships (u_id_1,u_id_2,status) VALUES (?,?,'active') ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id);

描述 table 的模式是:

DROP TABLE IF EXISTS `friendships`;
CREATE TABLE `friendships` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `u_id_1` int(11) NOT NULL,
  `u_id_2` int(11) NOT NULL,
  `status` enum('active','pending','rejected','blocked') DEFAULT 'pending' NOT NULL,
  `initiatiator` enum('1','2','system') DEFAULT 'system' NOT NULL,
  `terminator` enum('1','2','system') DEFAULT NULL,
  `confirm_timestamp` timestamp DEFAULT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY (`u_id_1`,`u_id_2`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

您的 ON DUPLICATE KEY UPDATE 语句在这里对您完全没有帮助。

您正在使用 LAST_INSERT_ID,它是最后成功插入的行的 auto inc,并尝试使用该 ID 更新重复的行。这将始终导致重复的主要(您正在尝试更改某行的 ID 以匹配您添加的最后一件事的 ID)

如果您的目标是

  • 插入一个新行,
  • 用 'active'
  • 更新现有行

然后

INSERT INTO friendships (u_id_1,u_id_2,status)
        VALUES          ( ?    , ?    ,'active')
        ON DUPLICATE KEY UPDATE
            status = 'active';  -- I changed this

另一个考虑因素是检查来源是否重复。我有一个简单的审计 table

INSERT INTO table
 field1, field2, ... , field3
 ON DUPLICATE KEY UPDATE row_id=row_id;

其中 field1INDEX 但不是 UNIQUErow_IDINTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY

运行 多年,但意外的重复行触发了此错误。

已通过对源进行去重修复。

对于这里的许多读者来说,这可能是一个微不足道的问题,但它让我有些头疼(接着是捂脸)。