2013-02-25 3 views
2

В MySQL вы можете вставить несколько строк в таблицу и получить список строк, которые преуспели или не удались?Попытка нескольких вставок и получение списка идентификаторов, которые не удались

Или вы должны вставлять каждую строку отдельно в свой собственный оператор, чтобы определить, удалось ли вставить?

(Может несколько вставок быть представлены в партии, но успех каждого в отдельности приходится в какой-либо другой БД? Е.Г. PostgreSQL?)

+1

Зачем нужна вставка? Из-за дубликатов идентификаторов? Невозможно вернуть, какие строки не удались, но вы можете заменить уже существующие идентификаторы. Обычно, если вставка терпит неудачу, весь запрос останавливается. – sjdaws

+0

@sjdaws Да, сбой при отказе, например. дубликаты; так что нет никакого способа ... возможно, если вы положите это в ответ, вы можете получить от него и принять его. – Will

+0

Я добавил несколько вариантов ответа об обнаружении сбоев. – sjdaws

ответ

5

Там нет никакого способа узнать, какие строки не удалось при выполнении массовой вставки. Обычно запрос терпит неудачу, если вы делаете несколько вставок, и по какой-либо причине один из них не работает.

Однако, есть несколько вариантов, которые могут быть выполнены для обеспечения успешного выполнения запроса.

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; 
+0

Это интересный способ выявления сбоев, хотя я не вижу, где ОП упоминает, что у них есть столбец «сбоев». Тем не менее, мне нравится подход в любом случае +1. –

+0

Это пример, OP не упоминает никаких таблиц или столбцов. Если бы это было реализовано на практике, я бы предположил, что столбец ошибок имеет значение по умолчанию 0, поэтому он не требует возврата и обновления другого кода. – sjdaws

Смежные вопросы