2009-06-25 51 views
5

我正在使用內存表。它有幾個ID和計數器,所有的數據都是整數。 如果數據存在,我的代碼會將計數器更新1,否則會創建一個計數器= 1的行。Mysql重複進入錯誤ON DUPLICATE KEY UPDATE

我使用的查詢是:

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

偶爾(插入的5%左右),我得到「重複項‘[關鍵數字】’關鍵1

這可能是什麼問題,難道不是? 「T的對重複密鑰更新部分應該處理重複鍵

更新:加入創建真正的表的表

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

可以上傳linked_mem的創建表 – 2009-06-25 09:56:02

回答

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 

PRIMARY KEY定義中刪除cnt

1

cnt是在主鍵中,也許這就是導致錯誤/無法更新它的原因。

1

你確定主鍵是否正確?使用這個主鍵也可以通過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),但這種已存在。

0

很難說清楚你的無意義的列名,但是這個主鍵太寬了,看起來很沒用。它究竟在做什麼,爲什麼選擇了這一組列?有更好的選擇嗎?我猜其他海報是正確的,你的更新違反了PK的隱式唯一性約束;計數是你的PK列之一,這是非常值得期待的。

0

我有同樣的問題。

使用對重複密鑰更新,仍然具有錯誤:重複條目

它是由具有唯一鍵索引另一列並具有一個空值一排造成的。

相關問題