SQL拒绝批量插入,因为单行是重复的

时间:2013-09-20 13:31:52

标签: php mysql insert duplicates composite-key

我不知道正确的术语,但通过“批量插入”我的意思是......

INSERT INTO `table` (`column1`, `column2`, `column3`) VALUES 
("value1", "value2", "value3"),
("value4", "value5", "value6"),
("value7", "value8", "value9")

我们在一个查询中插入多行以节省资源。

我们在此表上设置了一个复合键,以避免获得重复记录。问题是,当存在重复记录时,它会拒绝整个“批处理”,因此在上面的示例中,如果column1列中已存在“value1”,则不会插入3行中的任何一行。 / p>

我们正在使用带有mysql_函数的PHP(是的,我知道它们已被弃用,让我们一次解决一个问题)

所以我的问题是,有没有办法一次插入多行,如果有重复的行,它仍然会在“批处理”中插入其余行?

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

尝试使用ignore关键字

INSERT IGNORE INTO `table` ...
  

如果使用IGNORE关键字,则会忽略执行INSERT语句时发生的错误。例如,没有IGNORE,重复表中现有UNIQUE索引或PRIMARY KEY值的行会导致重复键错误,并且语句将中止。使用IGNORE时,仍未插入行,但不会发生错误。忽略错误可能会生成警告,但重复键错误不会。

答案 1 :(得分:2)

补充juerguen的答案,你也可以使用:

INSERT INTO thetable (pageid, name)
VALUES (1, "foo"), (1, "foo")
ON DUPLICATE KEY UPDATE (pagecount = pagecount + 1)

这样,您就可以识别出重复的行,并在流程结束时将其删除。

例如,将标志字段添加到名为is_duplicated

的表中
INSERT INTO thetable (pageid, name)
VALUES (1, "foo"), (1, "foo")
ON DUPLICATE KEY UPDATE (is_duplicated = 1)

后来:

DELETE FROM thetable WHERE is_duplicated = 1

你也可以使用:

SET foreign_key_checks = 0;

执行批处理,然后:

SET foreign_key_checks = 1;

这样,如果当时可能不存在外键,但稍后会创建,那么插入内容也会继续存在。