我正在尝试在数据库中插入多行。在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)
答案 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');