MySQL Multi-Insert? Целостность БД MySQL после неудачной INSERT - PullRequest
1 голос
/ 26 августа 2010

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

Ответы [ 3 ]

4 голосов
/ 26 августа 2010

Это именно то, для чего транзакции .Если какая-либо из команд завершится неудачно, то после отката 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;

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

1 голос
/ 26 августа 2010

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

0 голосов
/ 26 августа 2010

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

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

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

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

...