- ベストアンサー
リレーションについて
- ヘッダ情報と明細データを紐付ける仕組みについて教えてください。
- ヘッダ情報を削除した際に明細データも削除する方法を教えてください。
- 明細のみを削除する際にヘッダ情報は残す方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
もともと親子関係においては (1)子は親の値しか使用できない。 (2)親は子が存在する間は削除できない。 (3)親は子が存在する間は変更できない。 というルールなのです。 だから、ON DELETE とかON UPDATE は オマケみたいなもので、本来は無いと 考えるべきです。 DELETEはキー整合をとりますが、 TRUNCATEは何も考えずバッサリ なので、処理速度は断然有利です。 その代わりON DELETEが利かず、 不整合が生じる可能性があるため 外部キー参照のあるテーブルでは使用 できません。 外部キー参照は物理的に整合性を保つ ためには便利ですし、親子結合で行う クエリも高速です。但し、データの追加や 削除で、リレーションシップの更新を伴う ため、こういう関係を持たないテーブルの 追加/更新より時間がかかるという欠点も あります。 かつて、CPUの性能が悪く、DBが遅い 時代にはリレーションの設計は大事な 要素でした。しかし、何時の頃からか リレーションは廃れてしまい、今は取り 入れない方が普通になりました。 レコード数が大量で親子関係の参照機会が 多く、データの追加/変更/削除の頻度が 低い場合は外部キー参照は有効です。 それ以外では物理的な関係は持たない方が よいでしょう。
その他の回答 (2)
- masa--oka
- ベストアンサー率50% (1/2)
アプリケーションの詳細がわからないので何とも言えないのですが、 販売管理等のアプリでは単純にデータを削除しないほうがいいです。 削除すると経緯が全く分からなくなるので、 マイナスの売上をたてる、もしくは、削除フラグを立てるといった処理の方が賢明です。
お礼
返答が遅くなってすみません。 なるほど。 削除フラグを追加して対応したいと思います。 本当にありがとうございました。
- nda23
- ベストアンサー率54% (777/1415)
「外部キー制約」という方法を使います。 ヘッダの定義 CREATE TABLE HEADER ( HEADER_NO VARCHAR(4) PRIMARY KEY, ~); 明細の定義 CREATE TABLE DETAIL ( HEADER_NO VARCHAR(4) REFERENCES HEADER(HEADER_NO) ON DELETE CASCADE ~); http://www.postgresql.jp/document/9.1/html/ddl-constraints.html#DDL-CONSTRAINTS-FK
補足
返事がおそくなってすみません。 nda23さんのアドバイス通りテーブルを作成して、各テーブル(HEADER、DETAIL)にレコードを追加、そしてHEADERテーブルのレコードを削除したらDETAILのレコードも一緒に削除する事ができました。 ありがとうございました。 外部キーを指定したテーブルに「TRUNCATE TABLE」を実行したらエラーが出力されました。 調べたら外部キーを指定したテーブルには「TRUNCATE TABLE」が使えない事を知りました。 ・cannot truncate a table referenced in a foreign key constraint もう少し私にお付き合いしていただけませんでしょうか。 外部キーを指定する方法と各テーブル(HEADER、DETAIL)に対してDELETEを実行する方法ではどちらが適切なのでしょうか。 私の勉強不足で申し訳ありませんが再度、アドバイスいただけませんでしょうか。 宜しくお願いします。
お礼
返答が遅くなってすみません。 大変、勉強になりました。 リレーションを貼らない方向でやりたいと思います。 本当にありがとうございました。