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()
чтобы выяснить идентификаторы новых строк, так как он возвращает только созданный последний идентификатор, а не набор идентификаторов.
Если вам нужно гарантировать целостность, используйте операторы вставки в одну строку и транзакции.