質問:
たまたまデータベースの本見ていると
特定のDBMSに依存しない標準SQL言語の CREATE TABLE って所で
FOREIGN KEY の NO ACTION ってあるのですが、
どういった目的でこの NO ACTION を使うのでしょうか?
答え:
整合性制約(参照制約)では、被参照表(親)に存在しないキーに参照表
(子)を更新しようとしたり、子が存在する状態の親を削除するとエラーと
するのが標準的な仕様です。これが、「NO ACTION」です。

これは本来、「親を削除する場合は、子を削除してから行う」、「子のキー
を更新する場合は、親に存在するキーに更新する」という整合性を保てない
操作を防止する目的に使われます。

一方、「CASCADE」は、強引に整合性を保つ方法であり、これはリレーショ
ナルDB以前に汎用機で主に使われていた階層型DBやネットワーク型DBの発想
です。

私は長らく、コンピュータメーカー系ソフトウェア会社で、汎用機のDBMSの
設計に携わっていました。標準SQLに対応した機能サポートもたくさん行って
きましたが、私の記憶では当初は「NO ACTION」や「CASCADE」といった指定
はなく、「NO ACTION」に相当する仕様のみ規定されていたのではないかと
思います。
その後の仕様拡張で、階層型DBやネットワーク型DBにある機能に相当する
「CASCADE」ができたのではないかと思います。
したがって、昔から整合性制約(参照制約)を知っていた人には、「NO
ACTION」の仕様が常識です。

最初の質問では、「CASCADEを使う場合が多い」と書かれていましたが、
「CASCADE」を使うと、アプリケーションの不良などで誤って親を削除すると
子まで削除されてしまいます。「NO ACTION」なら、そういった誤操作を禁止
できます。
こういった誤操作は、定型業務で十分にテストされたアプリケーションでは
殆ど起こらないでしょうが、非定型な業務などで十分にテストせずに実行
すると、うっかりミスでデータを更新したり消してしまうことがあり得ます。
「NO ACTION」では、そういったことを防止できるのです。
補足の質問:
凄いご回答感謝。
時折融通がきかないなと思うけど整合性制約はDBMSの命のひとつですからね。この質問・回答は役に立ちましたか?

ウェブサイトのユーザーによる情報ポスト、JPQA.comのない保証の正しさ.

  • RAR分割ファイルについてなんですが、RAR書庫を解凍し...
  • Microsoft Office Outlook 2003を使用しています。...
  • Apache + PHP + PostgreSQLを用いてデータベースを...
  • もう一度質問です。よろしくお願いします。先ほどの質...
  • 自宅のPCとオフィスのPCでフォントの種類を同じに...
  • セキュリィティ対策ソフトの、マカフィ〜・ノートン・...