UPDATE での Primary Key の更新について
達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)
- 作者: ミック
- 出版社/メーカー: 翔泳社
- 発売日: 2008/02/07
- メディア: 単行本(ソフトカバー)
- 購入: 54人 クリック: 1,004回
- この商品を含むブログ (78件) を見る
勉強中。
SQL って、コーディング規約とかあまり見かけないなので、どう書いていいか困る。
Kindle で買って、今何ページ目か分からないけど、6% まで。
今のところ、違和感がある文・説明が以下。
UPDATE sometable SET p_key = CASE WHEN p_key = 'a' THEN 'b' WHEN p_key = 'b' THEN 'a' ELSE p_key END WHERE p_key IN ('a', 'b') ;
p_key はプライマリキーなのだが、PostgreSQL と MySQL では重複エラーになる。
このことに対して、
本来、制約は文よる変更が終わった時点で施行されるものであるため、実行途中で一時的に重複が生じても問題はありません。事実、Oracle、DB2、SQL Server では問題無く実行できます。
とあるが、これは本当にそうなのか?UPDATE が完了されるまでは、現時点での状態に合わせてチェックされるのが普通かな?と思ったので、PostgreSQL と MySQL の挙動のほうが納得できる気がしている。
その他商用DBの方が独自の実装が多いような印象(ほんとに勝手なイメージだけど)がある。
何を正とするか、だけど、PostgreSQL なんかはSQL準拠頑張ってると聞いたこともあるし。
マニュアル見ても、指摘されている「おかしさ」については説明されていない。
https://www.postgresql.jp/document/9.4/html/sql-update.html
このコマンドは標準SQLに準拠しています。 ただしFROM句およびRETURNING句はPostgreSQLの拡張です。 UPDATEでWITHが使用可能であることも同様に拡張です。
たいしたことじゃないかもしれないが、モヤモヤするな。