0

我正在尝试将多行插入数据库。在 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)

4

1 回答 1

3

您的查询是:

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

这个单一的语句将一个或多个行插入editionsauthorization_codes. 如果多行具有给定isbn的 in 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');
于 2013-08-05T19:31:16.127 回答