Там нет никакого способа узнать, какие строки не удалось при выполнении массовой вставки. Обычно запрос терпит неудачу, если вы делаете несколько вставок, и по какой-либо причине один из них не работает.
Однако, есть несколько вариантов, которые могут быть выполнены для обеспечения успешного выполнения запроса.
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;
Зачем нужна вставка? Из-за дубликатов идентификаторов? Невозможно вернуть, какие строки не удались, но вы можете заменить уже существующие идентификаторы. Обычно, если вставка терпит неудачу, весь запрос останавливается. – sjdaws
@sjdaws Да, сбой при отказе, например. дубликаты; так что нет никакого способа ... возможно, если вы положите это в ответ, вы можете получить от него и принять его. – Will
Я добавил несколько вариантов ответа об обнаружении сбоев. – sjdaws