1

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

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

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

我们在这个表上设置了一个复合键以避免重复记录。问题是,当有重复记录时,它会拒绝整个“批次”,所以在上面的例子中,如果“value1”已经存在于column1列中,它不会插入任何 3 行。

我们将 PHP 与 mysql_ 函数一起使用(是的,我知道它们已被弃用,让我们一次解决一个问题)

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

谢谢你的帮助。

4

2 回答 2

3

试试ignore关键字

INSERT IGNORE INTO `table` ...

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

于 2013-09-20T13:33:34.570 回答
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;

这样,如果有一个当时可能不存在但稍后会创建的外键,插入也将继续进行。

于 2013-09-20T14:04:55.803 回答