UPDATE文にて結合テーブルに対してWHERE句で条件しぼってるのに全行アップデートされるという悪夢におそわれました。
原因不明です。解決策は見つけました!
<実行環境>
・PostgreSQL 8.4.20
・PhpPgAdmin 5.0.4
<データ>
fruits_table
id | name | description |
---|---|---|
1
|
日向夏 | 宮崎のくだもの |
2
|
バナナ | 私の嫌いなくだもの |
3
|
ぶどう | 私の好きなくだもの |
price_table
id | price |
---|---|
1
|
300
|
2
|
100
|
3
|
200
|
くっつけると、、、
id | name | description | price |
---|---|---|---|
1
|
日向夏 | 宮崎のくだもの |
300
|
2
|
バナナ | 私の嫌いなくだもの |
100
|
3
|
ぶどう | 私の好きなくだもの |
200
|
<失敗SQL>
UPDATE price_table SET price = 150 FROM price_table T1 JOIN fruits_table T2 ON T1.id = T2.id WHERE T2.name = 'バナナ'
id | name | description | id | price |
---|---|---|---|---|
1
|
日向夏 | 宮崎のくだもの |
1
|
150
|
2
|
バナナ | 私の嫌いなくだもの |
2
|
150
|
3
|
ぶどう | 私の好きなくだもの |
3
|
150
|
(゚⊿゚)!!!
「バナナ」だけpriceを150にしたいのに
すべてのpriceが150になっちゃいました><
落ち着いて見る
SELECT * FROM fruits_table T1 INNER JOIN price_table T2 ON T1.id = T2.id WHERE T1.name = 'バナナ'
これ(上のSQL)実行したらちゃんとバナナだけの行を選択できるのにな・・・。
id | name | description | id | price |
---|---|---|---|---|
2
|
バナナ | 私の嫌いなくだもの |
2
|
100
|
うーん、ASをつかわず以下を実行すると
UPDATE price_table SET price = 100 FROM price_table JOIN fruits_table ON fruits_table.id = price_table.id WHERE fruits_table.name = 'バナナ'
SQL エラー:
ERROR: table name "price_table" specified more than once
と言われる。
(教えて、Googleせんせーい!)
検索ワード「update テーブル結合 postgres」 ポチっ
発見したーーー!!!→リンク
JOINではなくWHEREで結合させるんだってさ。
UPDATE price_table T1 SET price = 150 FROM fruits_table T2 WHERE T2.id = T2.id AND T2.name = 'バナナ'
id | name | description | id | price |
---|---|---|---|---|
1
|
日向夏 | 宮崎のくだもの |
1
|
300
|
2
|
バナナ | 私の嫌いなくだもの |
2
|
150
|
3
|
ぶどう | 私の好きなくだもの |
3
|
200
|
これで思い通りのアップデートが無事できました^^