
No.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;
により、商品マスタの商品コードも連鎖的に変更されます。
この回答へのお礼
お礼日時:2009/05/26 17:29
返信遅れて申し訳ございません。
とてもわかりやすい解説ありがとうございました。
遅延制約についての必要性や使い道などを理解することができました。
どうもありがとうございました<(_ _)>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「マスタ」と「テーブル」の違...
-
重複するキーから一番古い年月...
-
update文で質問です。 下記の条...
-
主キーの変更
-
2つのテーブルから条件に一致...
-
PLSQLの識別子エラー
-
Accessでフィールドを比較した...
-
VIEWでテーブルの集計結果...
-
続.ORACLEのSELECTのソートに...
-
複数テーブルの不一致クエリに...
-
Accessユニオンクエリーで2つ...
-
項目内の改行がレコードの終わ...
-
sqlで質問です。 Aテーブルは店...
-
3つ以上のテーブルをUNIONする...
-
SELECT時の行ロックの必要性に...
-
accessのエクスポートエラーに...
-
ACCESSのSQLで、NULLかNULLでな...
-
Accessにインポートしたら並び...
-
オラクルではできるのにSQLSERV...
-
SQL Server のデータをCSVファ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「マスタ」と「テーブル」の違...
-
2つのテーブルから条件に一致...
-
重複するキーから一番古い年月...
-
主キーの変更
-
行方向のデータを横に並べる
-
Accessでフィールドを比較した...
-
続.ORACLEのSELECTのソートに...
-
PLSQLの識別子エラー
-
VIEWでテーブルの集計結果...
-
項目内の改行がレコードの終わ...
-
accessで移動平均する方法
-
ACCESS 一つのフィールドに複...
-
履歴を管理するテーブル構造に...
-
商品コード番号を入力すると商...
-
Inner join と Left joinの明...
-
SQL 2つのテーブルとSUBSTRING...
-
ACCESSのコンパイルエラーについて
-
ACCESS2000です。
-
正規化・リレーションシップに...
-
Accessユニオンクエリーで2つ...
おすすめ情報