我不知道正确的术语,但通过“批量插入”我的意思是......
INSERT INTO `table` (`column1`, `column2`, `column3`) VALUES
("value1", "value2", "value3"),
("value4", "value5", "value6"),
("value7", "value8", "value9")
我们在一个查询中插入多行以节省资源。
我们在此表上设置了一个复合键,以避免获得重复记录。问题是,当存在重复记录时,它会拒绝整个“批处理”,因此在上面的示例中,如果column1
列中已存在“value1”,则不会插入3行中的任何一行。 / p>
我们正在使用带有mysql_函数的PHP(是的,我知道它们已被弃用,让我们一次解决一个问题)
所以我的问题是,有没有办法一次插入多行,如果有重复的行,它仍然会在“批处理”中插入其余行?
感谢您的帮助。
答案 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;
这样,如果当时可能不存在外键,但稍后会创建,那么插入内容也会继续存在。