1

一度に複数のテーブルに行を挿入することはできますか? ID で関連付けられた複数のテーブルを作成する場合。INSERT が失敗した場合に整合性を維持するための最良の方法は何ですか?

4

3 に答える 3

4

それがまさにトランザクションの目的です。コマンドのいずれかが失敗した場合、それ以降のすべて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 コマンド(例: CREATEALTERDROP) はロールバックできません!

于 2010-08-26T14:55:26.960 に答える
1

トランザクションを使用してください、ルーク。

于 2010-08-26T14:54:10.207 に答える
0

MySQL は、次のように複数の行を挿入できます(「複数の行」を検索)。

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

ただし、レコード、重複、および警告の数を返すクエリを除いて、制約違反が原因で何が挿入され、何が挿入されなかったのかを知る方法はありません。last_insert_id()また、一連の ID ではなく、作成された LAST ID のみを返すため、新しい行の ID を把握するために使用することもできません。

整合性を保証する必要がある場合は、単一行の挿入ステートメントとトランザクションを使用してください。

于 2010-08-26T14:55:50.787 に答える