在 MySQL 中,您可以在表中插入多行并获取成功或失败行的列表吗?
或者您必须在自己的语句中单独插入每一行以确定插入是否成功?
(是否可以批量提交多个插入,但每个插入的成功在任何其他数据库中都单独说明?例如 PostgreSQL?)
在进行批量插入时,无法找出哪些行失败。通常,如果您正在执行多个插入并且其中一个因任何原因而失败,则查询通常会失败。
但是,您可以采取一些选项来确保查询成功。
1)使用REPLACE INTO
而不是INSERT INTO
。如果主键已经存在,这将导致 MySQL 覆盖现有行。
2)INSERT IGNORE INTO
用于跳过现有行。缺点是你不知道哪些行被跳过了。
3)使用INSERT INTO ... ON DUPLICATE KEY UPDATE ...
。这将允许您更新已存在的行的一个、两个或所有字段。如果您有一个空字段,您也可以将其用作伪故障指示器。
// clear out failures from previous runs
UPDATE table SET failures = 0;
// insert the row if we can, otherwise record the failure and move on without updating the row
INSERT INTO table
(id, name) VALUES
(1, 'John'),
(2, 'Steve'),
...
(500, 'Tim')
ON DUPLICATE KEY UPDATE failures = failures + 1;
// check failures
SELECT id, name, failures FROM table;