MySQL 複数のテーブルに挿入しますか? (データベースの正規化?) [重複] 質問する

MySQL 複数のテーブルに挿入しますか? (データベースの正規化?) [重複] 質問する

同じクエリで複数のテーブルの情報を取得する方法を見つけようとしましたinsertが、不可能だとわかりました。そのため、insert複数のクエリを使用するだけでそれを実現したいと考えています。

INSERT INTO users (username, password) VALUES('test', 'test')
INSERT INTO profiles (userid, bio, homepage) VALUES('[id of the user here?]','Hello world!', 'http://www.stackoverflow.com')

しかし、テーブルの自動増分を「手動」にするidにはどうすればよいでしょうか?usersuseridprofile

ベストアンサー1

いいえ、1 つの MySQL コマンドで複数のテーブルに挿入することはできません。ただし、トランザクションを使用することはできます。

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;

見てLAST_INSERT_ID()自動インクリメント値を再利用します。

あなたが言った "これまでずっと解決しようとしてきましたが、まだうまくいきません。生成された ID を $var に入れて、その $var をすべての MySQL コマンドに入れるだけではだめでしょうか?

詳しく説明します: ここでは 3 つの方法が考えられます:

  1. 上記のコードでは、すべてが MySQL で実行され、LAST_INSERT_ID()2 番目のステートメントの値は、最初のステートメントで挿入された自動インクリメント列の値に自動的に設定されます。

    残念ながら、2 番目のステートメント自体が自動増分列を持つテーブルに行を挿入すると、LAST_INSERT_ID()テーブル 1 ではなくテーブル 2 に更新されます。その後もテーブル 1 が必要な場合は、変数に格納する必要があります。これにより、方法 2 と 3 が実現します。

  2. LAST_INSERT_ID()MySQL 変数に次のものを保存:

    INSERT ...
    SELECT LAST_INSERT_ID() INTO @mysql_variable_here;
    INSERT INTO table2 (@mysql_variable_here, ...);
    INSERT INTO table3 (@mysql_variable_here, ...);
    
  3. LAST_INSERT_ID()PHP 変数 (またはデータベースに接続できる任意の言語) に次の内容を保存します。

    • INSERT ...
    • LAST_INSERT_ID()MySQLでリテラルステートメントを実行するか、たとえばPHPを使用して、mysql_insert_id()あなたの言語を使用してを取得します。
    • INSERT [use your php variable here]

警告

どのような解決方法を選択するにしても、何が起こるべきかを決めなければなりませんクエリ間で実行が中断されるかどうか(たとえば、データベース サーバーがクラッシュした場合)。「一部は完了し、残りは完了していない」という状況で我慢できる場合は、読み進めないでください。

ただし、「すべてのクエリが終了するか、またはどれも終了しない - 一部のテーブルには行が必要で、他のテーブルには一致する行がないこと、データベース テーブルが常に一貫していること」を決定した場合は、すべてのステートメントをトランザクションでラップする必要があります。ここでは、およびを使用したのはそのためBEGINですCOMMIT

おすすめ記事