MySQL Multi-Insert? Целостность БД MySQL после неудачной INSERT

Можно ли вставить строку в несколько таблиц одновременно? Если вы делаете несколько таблиц, связанных с идентификатором; Каков наилучший способ обеспечения целостности в случае сбоя INSERT?

3 ответа

Решение

Это именно то, для чего предназначены транзакции. Если какая-либо из команд не работает, все START TRANSACTION откатывается:

START TRANSACTION;
INSERT INTO sometable VALUES(NULL,'foo','bar');
INSERT INTO someothertable VALUES (LAST_INSERT_ID(),'baz');
COMMIT;

Будучи MySQL, вы не можете использовать транзакции с таблицами MyISAM (вам понадобятся таблицы, чтобы использовать какой-то движок, который поддерживает это, возможно, InnoDB).

Это никогда не будет вставлено в таблицу (обычно у вас будет некоторое ветвление, например, IF):

START TRANSACTION;
INSERT INTO sometable VALUES(NULL,'data','somemoredata');
ROLLBACK;

Предостережение: команды SQL, которые изменяют структуру базы данных (например, CREATE,ALTER,DROP) нельзя откатить!

Используйте транзакции, Люк.

MySQL может вставить несколько строк (поиск "несколько строк") следующим образом:

INSERT INTO table (field1, field2, ...) VALUES (value1, value2), (value3, value4), etc...

Однако невозможно определить, что было вставлено, а что нет из-за нарушений ограничений, кроме запроса, возвращающего количество записей, дубликатов и предупреждений. Вы также не можете использовать last_insert_id() чтобы выяснить идентификаторы новых строк, так как он возвращает только созданный последний идентификатор, а не набор идентификаторов.

Если вам нужно гарантировать целостность, используйте операторы вставки в одну строку и транзакции.

Другие вопросы по тегам