読者です 読者をやめる 読者になる 読者になる

UPDATE での Primary Key の更新について

SQL DB

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

勉強中。
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 はプライマリキーなのだが、PostgreSQLMySQL では重複エラーになる。
このことに対して、

本来、制約は文よる変更が終わった時点で施行されるものであるため、実行途中で一時的に重複が生じても問題はありません。事実、OracleDB2SQL Server では問題無く実行できます。

とあるが、これは本当にそうなのか?UPDATE が完了されるまでは、現時点での状態に合わせてチェックされるのが普通かな?と思ったので、PostgreSQLMySQL の挙動のほうが納得できる気がしている。
その他商用DBの方が独自の実装が多いような印象(ほんとに勝手なイメージだけど)がある。

何を正とするか、だけど、PostgreSQL なんかはSQL準拠頑張ってると聞いたこともあるし。
マニュアル見ても、指摘されている「おかしさ」については説明されていない。

https://www.postgresql.jp/document/9.4/html/sql-update.html

このコマンドは標準SQLに準拠しています。 ただしFROM句およびRETURNING句はPostgreSQLの拡張です。 UPDATEでWITHが使用可能であることも同様に拡張です。

たいしたことじゃないかもしれないが、モヤモヤするな。