2013-08-05 54 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');