更新中的自动增量值与内部生成的值冲突
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;
其中 field1
是 INDEX
但不是 UNIQUE
,row_ID
是 INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY
。
运行 多年,但意外的重复行触发了此错误。
已通过对源进行去重修复。
对于这里的许多读者来说,这可能是一个微不足道的问题,但它让我有些头疼(接着是捂脸)。
我不时从 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;
其中 field1
是 INDEX
但不是 UNIQUE
,row_ID
是 INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY
。
运行 多年,但意外的重复行触发了此错误。
已通过对源进行去重修复。
对于这里的许多读者来说,这可能是一个微不足道的问题,但它让我有些头疼(接着是捂脸)。