重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

現在データベースの制約である遅延制約について調べています。

少しだけ理解はしたのですが
具体的な例で説明してるサイト様が中々見つかりません。

どんな時にこの制約が必要なのか
簡単な例をあげて教えて頂けたらと思います。

もしくはそのような説明があるサイト様があればぜひ…

宜しくお願いします<(_ _)>

A 回答 (1件)

一例としてコメントしますが。



取引テーブルと商品マスタがあり、取引テーブルの商品コードは商品マスタの商品コードに対して外部参照制約がかかっています。
すでに取引テーブルにはその商品の取引が記録されています。
商品マスタの見直しにより、商品コード3桁のものを4桁に変更しなくてはいけなくなりました(101は1101)。

UPDATE 商品 SET 商品コード=商品コード+1000 WHERE 商品コード<=999;
UPDATE 取引 SET 商品コード=商品コード+1000 WHERE 商品コード<=999;
外部参照制約がかかっているため、どちらを先に実行してもエラーになります。

この場合の対応方法は大別して3種類
1) 一旦外部制約を無効にする
 ALTER TABLE 取引 DISABLE CONSTRAINT 外部制約1;
 UPDATE 商品 SET 商品コード=商品コード+1000 WHERE 商品コード<=999;
 UPDATE 取引 SET 商品コード=商品コード+1000 WHERE 商品コード<=999;
 COMMIT;
 ALTER TABLE 取引 ENABLE CONSTRAINT 外部制約1;

2) 新しい商品コードを先に追加してしまう
 INSERT INTO 商品 SELECT 商品コード+1000,商品名 FROM 商品 WHERE 商品コード<=999;
 UPDATE 取引 SET 商品コード=商品コード+1000 WHERE 商品コード<=999;
 DELETE FROM 商品 WHERE 商品コード<=999;
 COMMIT;

3) もし外部参照制約に遅延制約がかかっていれば、
 SET CONSTRAINTS 外部制約1 DEFERRED;
 UPDATE 商品 SET 商品コード=商品コード+1000 WHERE 商品コード<=999;
 UPDATE 取引 SET 商品コード=商品コード+1000 WHERE 商品コード<=999;
 COMMIT;

他には取引データを取引テーブルに取り込んだ場合、存在しない商品コードであれば遡及して商品マスタにデータを追加する手順も認める場合(トリガ使用)など。一般的にはイレギュラーケースでも本来の更新手順で更新処理をしたい場合に利用できますが、他に方法がある場合遅延制約は使わなくてもよいと思います。

遅延制約をサポートしていないDBMSの場合、たとえばSQL Serverでは外部制約の連鎖更新がサポートされており、
 UPDATE 商品 SET 商品コード=商品コード+1000 WHERE 商品コード<=999;
により、商品マスタの商品コードも連鎖的に変更されます。
    • good
    • 0
この回答へのお礼

返信遅れて申し訳ございません。
とてもわかりやすい解説ありがとうございました。
遅延制約についての必要性や使い道などを理解することができました。

どうもありがとうございました<(_ _)>

お礼日時:2009/05/26 17:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す