ON UPDATE CASCADE

データベースにREFERENCES制約をつけまくったとき、整合性を保つためにデータが変更できなくなることがあって困っていたが、REFERENCEの連鎖更新をするSQLの指定もあるらしい。今までに読んだSQLの参考書には載っていなかった。(文献が古すぎたか?)
問題はデータベースがその機能に対応しているかどうか、だが。・・・PostgreSQLでも使えるらしい。*1検索すると「やたら処理が重くなる」みたいな相談も引っかかってきたりするけど。
PostgreSQLのマニュアルでそのあたりの説明をよく読むと、ON UPDATE CASCADEとかを使うより、REFERENCESをDEFERRABLE(延期可能)にして、(ついでに初期状態で延期にして、)制約適用が延期されたトランザクション内で処理するというのが推奨らしい。
きっちりとデータベース構造を把握しておくという観点からすると、無意識的に実行されるCASCADEの処理よりもDEFERRABLEの処理の方がよいのだろう。
今度からREFERENCES制約をつけるときはDEFERRABLEにするかどうかも設計しよう・・・
そう言えばデータベースを構築するために用意した一連のSQLで、「REFERENCES制約がややこしすぎて、テーブルを作成し終わってから後でREFERENCESを追加した*2」ことがあったが、制約適用の延期はこういう場面でも有効なのだろうか。・・・試す機会がまず無いなぁ。

*1:でも、うちのはバージョン古いからなぁ(笑)

*2:A->B->Aという感じで参照していて、Aを定義するのはBが前提、Bを定義するのはAが前提、という関係になっていた。実運用上は参照している部分でヌル値を許可しているので問題は発生しないのだが。たしかB、Aの順に定義して、そのあとでBにAへのREFERENCESを追加した。