###実現したいこと
複数行のレコードをINSERTしたいのですが、PKの値が同じレコードがあるとき、そのレコードは上書きしたいです。
###該当のソースコード
初期テーブルとしてabcカラムがあり、PKであるaに1という値が入っています。(PKの指定は割愛)
sql
1# 初期テーブル 2CREATE TABLE table1 3 (`a` int, `b` int, `c` int) 4; 5INSERT INTO table1 6 (`a`, `b`, `c`) 7VALUES 8 (1, 5, 15) 9;
これに対し以下INSERTを行いたいのですが、a=1は既に上記の通り存在するために、このレコードだけは上書きしたいです。
sql
1INSERT INTO table1 2 (a, b, c) 3VALUES 4 (1, 10, 100), (2, 20, 200)
###試したこと
調べて出てくるのが「ON DUPLICATE KEY UPDATE」ですが、使い方がいまひとつ理解できません。
以下では
「aが同じ値なら」の意味を込めて
「IF( a = VALUES(a)」を書いており、
「b」を上書きする」の意味を込めて
「b, VALUES(b)」を書いており、
それを合わせて
「b = IF( a = VALUES(a), b, VALUES(b) )」と書いています。
sql
1# aが同じ値ならUPDATEし、新しい値ならINSERTしたい 2INSERT INTO table1 3 (a, b, c) 4VALUES 5 (1, 10, 100), (2, 20, 200) 6ON DUPLICATE KEY UPDATE 7 b = IF( a = VALUES(a), b, VALUES(b) ) 8 ,c = IF( a = VALUES(a), c, VALUES(c) ) 9;
しかしここまでのコードをすべて実行し、以下のSELECTを実行しても、a=1のレコードが2つあり、計3つのレコードが増えてしまうといった状況です。
sql
1# 初期テーブル 2CREATE TABLE table1 3 (`a` int, `b` int, `c` int) 4; 5INSERT INTO table1 6 (`a`, `b`, `c`) 7VALUES 8 (1, 5, 15) 9; 10 11# aが同じ値ならUPDATEし、新しい値ならINSERTしたい 12INSERT INTO table1 13 (a, b, c) 14VALUES 15 (1, 10, 100), (2, 20, 200) 16ON DUPLICATE KEY UPDATE 17 b = IF( a = VALUES(a), b, VALUES(b) ) 18 ,c = IF( a = VALUES(a), c, VALUES(c) ) 19; 20 21# 3つのレコードが存在してしまっている 22SELECT * FROM table1 23 24/* 25以下になってしまう 26a b c 271 5 15 281 10 100 292 20 200 30 31以下がほしい 32a b c 331 10 100 342 20 200 35*/ 36
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/03 07:37