2013-08-05 80 views
0

我試圖插入多行到數據庫中。出的23000條插入語句,〜600未能以這種方式:Mysql重複的主鍵錯誤 - 但密鑰不存在db

示例查詢:

INSERT INTO authorization_codes (book_id, auth_code, unpaid) 
(SELECT edition_nid,'FLT9950526', 1 
FROM catapult.editions WHERE isbn_digital = '978-1-4533-2704-3'); 

錯誤消息:

重複條目 'FLT9950526' 的鍵[在查詢2800 ERROR] '主要'

在這種情況下的主鍵是 'auth_code'

select * from authorization_codes where auth_code = 'FLT9950526'; 

這不會返回任何行。

更多線索 - 在我使用多個插入語句運行的腳本中,錯誤在文件中連續發生。

當我將查詢從腳本中提取出來時,它以相同的方式出錯,並且出現重複的輸入錯誤。

我在做什麼導致這種情況?

(編輯 - 對不起,切&粘貼錯誤,抓住正確的錯誤行,感謝@克林斯曼-d)

+5

FLT9950526!= FLT9150367 –

+0

您可能插入的數據在多條記錄中包含相同的'auth_code'嗎? – DCoder

+0

嗨@ DCoder-在這種情況下,我最後會排到最後......但是不,我確實檢查了這一點。 '1匹配在緩衝器 「 'FLT9950526'」:codes.sql 5600:edition_nid, 'FLT9950526',1 FROM catapult.editions WHERE isbn_digital = '978-1-4533-2704-3');' – Slabgorb

回答

2

您所查詢的是:

INSERT INTO authorization_codes(book_id, auth_code, unpaid) 
    SELECT edition_nid, 'FLT9950526', 1 
    FROM catapult.editions 
    WHERE isbn_digital = '978-1-4533-2704-3'; 

此單個語句從插入一個或多個行editions分成authorization_codes。如果在editions中多於一行具有給定isbn,則查詢將嘗試插入具有相同auth_code的多行,導致違反唯一性約束。

由於SQL的工作方式,所有行都被插入或者沒有被插入。

爲了安全起見,你可以這樣做:

INSERT INTO authorization_codes(book_id, auth_code, unpaid) 
    SELECT edition_nid, 'FLT9950526', 1 
    FROM catapult.editions 
    WHERE isbn_digital = '978-1-4533-2704-3' 
    limit 1; 

(這將插入一個任意行。)

或者你可以改變你的腳本做這樣的事情如此重複永遠不會插入:

INSERT INTO authorization_codes(book_id, auth_code, unpaid) 
    SELECT edition_nid, 'FLT9950526', 1 
    FROM catapult.editions 
    WHERE isbn_digital = '978-1-4533-2704-3' and 
      1 = (select count(*) from catapult.editions where isbn_digital = '978-1-4533-2704-3');