【发布时间】:2015-10-08 16:58:55
【问题描述】:
我有一些代码试图用 2 列的新值更新表的现有行。该行将始终存在。它有一个主键和另一个唯一字段,更新指定唯一字段。我正在使用 INSERT / ON DUPLICATE KEY UPDATE 执行此操作。
但是,这并没有更新行,而是更新了恰好存在主键为 0 的行。如果不存在主键为 0 的行,则它可以正常工作。
我认为发生的事情是因为我没有指定主键 MySQL 在某处为此选择值 0,然后它使用主键 0 更新行而不是我指定唯一索引的实际行.
我确实注意到手册页说:-
一般来说,您应该尽量避免对具有多个唯一索引的表使用 ON DUPLICATE KEY UPDATE 子句。
问题可以证明如下:-
CREATE TABLE fred
(
id int(11) NOT NULL,
code varchar(32) NOT NULL,
stock int(5) NOT NULL,
is_active tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (id),
UNIQUE KEY code (code)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO fred VALUES
(0, 'a', 123, 1),
(2, 'b', 234, 1),
(3, 'c', 345, 1);
使用此数据,以下插入应更新第二行(主键 2,b 代码上的唯一索引),而是使用主键为零和唯一的a 代码的索引。
INSERT INTO fred (code,stock,is_active) VALUES ('b',46,68) ON DUPLICATE KEY UPDATE stock = VALUES(stock), is_active = VALUES(is_active);
没有切换到为此指定主键(或者只是删除主键为 0 的记录),而不是唯一键,我不知道如何彻底解决这个问题。
【问题讨论】:
-
你的id不应该有
AUTO_INCREMENT吗? -
我无法重现您的问题:sqlfiddle.com/#!9/b7d37d/1/0
-
id 不应该有自动增量(本质上 id 和代码是从外部系统生成的 - 代码对某些区域有意义,而 id 用于有效地连接表)。使用自动增量会停止使用 0 的 id,并且没有 0 的 id 不会发生问题。
-
@lad2025 - 删除自动增量后问题很明显 - sqlfiddle.com/#!9/90e4a/1
-
为什么
id不是你自己的主键(自动递增),你添加foreign_id键,它可以是任何值,它对应于外部系统给你的数字,沿着code?
标签: mysql