Mysql重复主键错误 - 但db中不存在键

时间:2013-08-05 17:46:51

标签: mysql sql

我正在尝试在数据库中插入多行。在23,000个插入语句中,约600个以这种方式失败:

示例查询:

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');

错误消息:

  

[查询2800中的错误]关键字“PRIMARY”的重复条目“FLT9950526”

这种情况下的主键是“auth_code

select * from authorization_codes where auth_code = 'FLT9950526';

这不会返回任何行。

更多线索 - 我在运行多个插入语句的脚本中,错误在文件中连续发生。

当我从脚本中取出查询时 - 它会以相同的方式出错,并出现重复的输入错误。

我在做什么导致这个?

(编辑 - 对不起,剪切和粘贴错误,抓错了错误行,谢谢@ juergen-d)

1 个答案:

答案 0 :(得分: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。如果多个行在isbn中具有给定editions,则查询将尝试插入具有相同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');