我正在使用内存表。它有几个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
答案 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 并仍然出现错误:重复条目
它是由另一列具有唯一键索引而且其中一行具有空值引起的。