質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

4260閲覧

2テーブル間でのデータの置換と挿入のSQL文

it_solution_lab

総合スコア71

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2016/11/14 16:04

メインのテーブルAに、追加用テーブルBの内容を入れたいときに
複数の項目値で比較し、一致したときは、テーブルBの内容で置換し、
テーブルBに存在し、テーブルAに存在しないレコードについては、テーブルAに挿入したい

REPLACEが 機能的には同じなのだが
テーブルの中身を一度に指定して置換と挿入を同時に行えないのだろうか

テーブルA
key1 key2 data1 data2
1 1 aaaa bbbb
1 2 cccc dddd
1 4 eeee ffff
2 1 gggg hhhh
2 3 iiii jjjj

テーブルB
key1 key2 data1 data2
1 1 AAAA BBBB
1 3 MMMM NNNN
2 2 XXXX ZZZZ
2 3 LLLL SSSS

これを置換挿入した結果
テーブルAの中身が
key1 key2 data1 data2
1 1 AAAA BBBB
1 2 cccc dddd
1 3 MMMM NNNN
1 4 eeee ffff
2 1 gggg hhhh
2 2 XXXX ZZZZ
2 3 LLLL SSSS
となるようにしたい
可能かどうか、可能な場合には、どのように記述すればよいか
教えてほしい

よろしくお願いいたします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

key1, key2 は複数カラム主キーまたは複数カラムユニークキーが設定してあるとして、

REPLACE 構文

SQL

1REPLACE INTO テーブルA 2SELECT * FROM テーブルB;

動作確認サンプル
https://paiza.io/projects/s6UGbMwPxm9q_sSr6sDlEg

ON DUPLICATE KEY UPDATE 構文

SQL

1INSERT INTO テーブルA 2SELECT * FROM テーブルB 3ON DUPLICATE KEY UPDATE 4 data1=テーブルB.data1, data2=テーブルB.data2;

動作確認サンプル
https://paiza.io/projects/AQFpYAAuxFPfPbomqjGQGQ

どちらも同じ結果になりますが、動作が異なります。
REPLACE構文はキーが一致する行を削除してから、挿入します。
ON DUPLICATE KEY UPDATE構文は、キーが一致する行は更新、なければ挿入します。

投稿2016/11/14 17:25

編集2016/11/15 02:09
hatena19

総合スコア33699

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KiyoshiMotoki

2016/11/15 01:38

hatena19様 横から失礼します。 > key1, key2 は複数カラム主キーが設定してあるとして、 について、(主キーではない)ユニークキーでもOKですよ。 https://dev.mysql.com/doc/refman/5.6/ja/insert-on-duplicate.html > UNIQUE インデックスまたは PRIMARY KEY に重複した値を発生させる行が挿入された場合は、MySQL によって古い行の UPDATE が実行されます。 https://dev.mysql.com/doc/refman/5.6/ja/replace.html > テーブル内の古い行に、PRIMARY KEY または UNIQUE インデックスに関して新しい行と同じ値が含まれている場合、その古い行は新しい行が挿入される前に削除されます。
hatena19

2016/11/15 02:06

あっ、そうですね。ご指摘ありがとうございます。 あとからの閲覧者のために回答を修正しておきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問