sql >> データベース >  >> RDS >> Mysql

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

    いいえ、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()<をご覧ください。 / code> 自動インクリメント値を再利用します。

    これを理解しようとしても、まだ機能しません。生成されたばかりのIDを$ varに入れて、その$ varをすべてのMySQLコマンドに入れることはできませんか? "

    詳細を説明します。ここには3つの方法があります:

    1. 上記のコードで。これはすべてMySQLで行われ、 LAST_INSERT_ID() 2番目のステートメントには、最初のステートメントに挿入されたautoincrement-columnの値が自動的に含まれます。

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

    2. LAST_INSERT_ID()をストックします ina 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()をストックします aphp変数(またはデータベースに接続できる任意の言語、選択したもの):

      • INSERT ...
      • 言語を使用してLAST_INSERT_ID()を取得します 、MySQLでそのリテラルステートメントを実行するか、たとえばphpの mysql_insert_id()を使用します。 それはあなたのためにそれをします
      • INSERT[ここでphp変数を使用]

    警告

    これを解決する方法を選択する場合は、クエリ間で実行が中断された場合に何が発生するかを決定する必要があります。 (たとえば、データベースサーバーがクラッシュします)。 「終わった人もいれば、終わっていない人もいる」と生きていけるのなら、読み進めないでください。

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



    1. Oracle PL/SQLをPostgresqlPL/pgSQLに変換するためのツール

    2. sqlalchemyを使用してpostgresqlに接続中にエラーが発生しました

    3. PostgreSQL:外部キー/オン削除カスケード

    4. Oracle SELECTTOP10レコード