MySQL插入/打开重复键失败

时间:2015-10-08 16:58:55

标签: mysql

我有一些代码尝试使用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的记录),而不是唯一的键我不知道如何干净地解决这个问题。

1 个答案:

答案 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);