[解決済み] 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
から
users
を "manual"に変更します。
userid
のために
profile
のテーブルを作成しますか?
どのように解決する?
いいえ、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つの可能な方法があります。
-
上にあるようなコードで。これは はすべてを MySQL で行っており
LAST_INSERT_ID()
を 2 番目の ステートメントは自動的に の値になります。 に挿入された の値になります。残念ながら、2つ目のステートメント自身がオートインクリメントカラムを持つテーブルに行を挿入すると
LAST_INSERT_ID()
はテーブル 2 のものに更新され、テーブル 1 のものには更新されません。もし、その後もテーブル1のそれが必要であれば、変数に格納する必要があります。これが方法2、3につながります。 -
をストックすることになります。
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, ...);
-
を仕入れる予定です。
LAST_INSERT_ID()
を php 変数 (またはデータベースに接続できる任意の言語) に格納します。 データベースに接続することができます。 を指定します。)-
INSERT ...
-
あなたの言語を使って
LAST_INSERT_ID()
を取得するには、MySQL でそのリテラルステートメントを実行するか、あるいは php のmysql_insert_id()
を使用することで、それを行うことができます。 -
INSERT [use your php variable here]
-
警告
どのような解決方法を選ぶにせよ、何が起こるべきかを決めなければなりません。 クエリ間で実行が中断された場合 (例えば、データベースサーバがクラッシュした場合など)。もしあなたが "some have finished, others not" に耐えられるのであれば、この先は読まないでください。
しかし、「すべてのクエリーが終了するか、または何も終了しないか - あるテーブルの行は必要ないが、他のテーブルの行は一致しない、私のデータベース テーブルは常に一貫していたい」と判断した場合、すべてのステートメントをトランザクションでラップする必要があります。そのために、私は
BEGIN
と
COMMIT
をここに追加します。
関連
-
MySQLで正規表現を使う 詳細
-
[解決済み] Ubuntu linux上で動作するリモートMySQLサーバーを再起動する方法は?
-
[解決済み] MySQLの複数行を1つのフィールドに連結することはできますか?
-
[解決済み] MySQLデータベースの名前を素早く変更する(スキーマ名を変更する)方法は?
-
[解決済み] MySQLデータベースのテーブルのサイズを取得する方法は?
-
[解決済み] MySQLテーブルへの挿入または存在する場合の更新
-
[解決済み] MySQLで'insert if not exists'を行うにはどうしたらいいですか?
-
[解決済み] MySQLで複数のカラムに一意制約を指定するには?
-
[解決済み] MySQL で特定のカラム名を持つすべてのテーブルを見つけるにはどうすればよいですか?
-
[解決済み] MySQLの データベースへの **all** 特権付与
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
mysqlでインデックスに障害が発生する原因は何ですか?
-
MySQLとOracleの一括挿入SQLの汎用的な記述例
-
mysqlのデータ圧縮性能比較 詳細
-
[解決済み】MySQL - オペランドは1つのカラムを含む必要があります。
-
[解決済み】MySQLで「すべての派生テーブルは独自のエイリアスを持つ必要があります」というエラーは何ですか?
-
sql エラーを解決する オペランドには1つの列が含まれている必要があります。
-
Mysql がエラーを報告 オペランドには 1 つのカラムが含まれている必要があります。
-
SQLException。オペランドは1列でなければなりません。
-
CMakeエラー。ソースディレクトリ "/xxx/mysql-5.6.21" に CMakeLists.txt がないようです。
-
[解決済み] SQLを使用してSUMとSUBTRACTを行うには?