我有一些代码尝试使用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的记录),而不是唯一的键我不知道如何干净地解决这个问题。
答案 0 :(得分:0)
以下是您要执行的操作版本:
CREATE TABLE fred (
id int(11) NOT NULL,
`code` varchar(32) NOT NULL,
stock int(5) NOT NULL,
is_active tinyint(1) NOT NULL,
PRIMARY KEY (`code`),
UNIQUE KEY `code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO fred (id, code, stock, is_active) VALUES
(1, 'a', 123, 1),
(2, 'b', 234, 1),
(3, 'c', 345, 1);
然后要更新您还需要发送ID,但主要唯一键是代码。
INSERT INTO fred (id, code, stock, is_active) VALUES (98, 'b',46,68) ON DUPLICATE KEY UPDATE stock = VALUES(stock), is_active = VALUES(is_active), id = VALUES(id);