MySQL では、単一のクエリを実行して複数のテーブルに同時にデータを挿入することはできません。これを実現するための一般的なアプローチの 1 つは、複数のクエリを使用することです。ただし、自動インクリメントされるユーザー ID を users テーブルから profiles テーブルの userid 列にどのように割り当てるかという問題が生じます。
自動インクリメントされる ID をシームレスに転送するため、トランザクションと LAST_INSERT_ID() 関数を活用できます。修正されたコード スニペットは次のとおりです。
BEGIN; INSERT INTO users (username, password) VALUES('test', 'test'); INSERT INTO profiles (userid, bio, homepage) VALUES(LAST_INSERT_ID(), 'Hello world!', 'http://www.stackoverflow.com'); COMMIT;
このトランザクションでは、最初のクエリが users テーブルにレコードを挿入します。 2 番目のクエリ内の LAST_INSERT_ID() 関数は、最初の挿入から自動インクリメントされた ID を取得し、それをプロファイル テーブルの userid フィールドに割り当てます。 COMMIT ステートメントはトランザクションを終了し、両方の挿入が完了または中止されることを保証します。
LAST_INSERT_ID() リセット: 2 番目のクエリがテーブルにレコードを挿入するとき自動インクリメント列を使用すると、LAST_INSERT_ID() が新しい ID に更新されます。これを防ぐには、MySQL または言語固有の変数に初期 ID を保存します。
オプション 1: MySQL 変数
INSERT ... SELECT LAST_INSERT_ID() INTO @mysql_variable_here; INSERT INTO table2 (@mysql_variable_here, ...);
オプション 2 : 言語変数
INSERT ... $last_id = mysql_insert_id(); INSERT INTO table2 ($last_id, ...);
トランザクションと中断: クエリ間でクエリの実行が中断されると、データの不整合が発生する可能性があります。データの整合性を確保するには、クエリの周囲にトランザクション ブロックを実装します。これにより、すべてのクエリが実行されるか、まったく実行されないかのどちらかが保証されます。
以上が自動インクリメントされる ID を処理しながら複数の MySQL テーブルにデータを挿入するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。