On DUPLICATE KEY UPDATE上的Mysql重复输入错误

时间:2009-06-25 09:49:49

标签: mysql

我正在使用内存表。它有几个id和计数器,所有数据都是整数。 如果数据存在,我的代码会将计数器更新为1,否则会创建一个counter = 1的行。

我使用的查询是:

INSERT INTO linked_mem
        ( id1, id2, id31, id4 cnt)
        VALUES (31316, 0, 557158967, 261470594, 1)
        ON DUPLICATE KEY UPDATE cnt= cnt+1

偶尔(大约5%的插入)我得到“重复输入'[键号]'为键1

可能是什么问题?是不是ON DUPLICATE KEY UPDATE部分应该处理重复键?

更新:添加真实表的创建表

CREATE TABLE `linked_mem` (
  `li_sid` int(10) unsigned NOT NULL default '0',
  `li_id1` int(10) unsigned NOT NULL default '0',
  `li_cid1` int(10) unsigned NOT NULL default '0',
  `li_id2` int(10) unsigned NOT NULL default '0',
  `li_cid2` int(10) unsigned NOT NULL default '0',
  `cnt` int(10) unsigned NOT NULL default '1',
  `li_filter` int(10) unsigned NOT NULL default '0',
  `li_group` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`li_id1`,`li_sid`,`li_cid1`,`li_cid2`,`li_group`,`cnt`,`li_id2`)
) ENGINE=MEMORY DEFAULT CHARSET=latin1

5 个答案:

答案 0 :(得分:10)

如果您更新标记为UNIQUE的字段并且UPDATE上发生第二次密钥违规,则会发生这种情况。

<强>更新

从你的桌面结构我可以看出它正是你的情况。

这就是发生的事情:

INSERT INTO linked_mem
        ( id1, id2, id31, id4 cnt)
        VALUES (31316, 0, 557158967, 261470594, 1)

-- inserts

INSERT INTO linked_mem
        ( id1, id2, id31, id4 cnt)
        VALUES (31316, 0, 557158967, 261470594, 1)

-- updates `cnt` to 2

INSERT INTO linked_mem
        ( id1, id2, id31, id4 cnt)
        VALUES (31316, 0, 557158967, 261470594, 1)

-- tries again to update `cnt` to 2 and fails

cnt定义中删除PRIMARY KEY

答案 1 :(得分:1)

cnt在主键中,可能是导致错误/无法更新它的原因。

答案 2 :(得分:1)

您确定主键是否正确?使用此主键也通过cnt的值标识一行,cnt应该是一个计数器。

我没有对此进行测试,但我认为如果以空表开头,以下查询将给出错误。

INSERT INTO linked_mem
    ( id1, id2, id31, id4, cnt)
VALUES 
    (1, 1, 1, 1, 1),                  // (1, 1, 1, 1, 1) added
    (1, 1, 1, 1, 1),                  // (1, 1, 1, 1, 1) -> (1, 1, 1, 1, 2)
    (1, 1, 1, 1, 1),                  // (1, 1, 1, 1, 1) added (now two rows)
    (1, 1, 1, 1, 1)                   // error
ON DUPLICATE KEY UPDATE cnt = cnt+1

在第四行,(1,1,1,1,1)将更新为(1,1,1,1,2),但这已经存在。

答案 3 :(得分:0)

很难用你那些无法提供信息的列名来判断,但主键太宽了,看起来很无用。它实际上在做什么,为什么选择这组列?有更好的选择吗?我猜其他海报是对的,你的更新违反了PK的隐含唯一性;计数是你的PK列之一,这几乎是预期的。

答案 4 :(得分:0)

我遇到了同样的问题。

使用 ON DUPLICATE KEY UPDATE 并仍然出现错误:重复条目

它是由另一列具有唯一键索引而且其中一行具有空值引起的。