3

次の問題に直面しています。一意の制約とチェック制約を組み合わせて作成したいと思います。

おそらく、DB の責任よりもビジネス ロジックの方が重要ですが、それでもなおです。

次の構造のテーブルがあります。

desc INSURANCE;

Name              Null     Typ           
----------------- -------- ------------- 
ID                NOT NULL NUMBER        
CUST_ID           NOT NULL NUMBER        
CONTRACT_TYPE     NOT NULL NUMBER
FROM_DATE         NOT NULL DATE          
TO_DATE           NOT NULL DATE   

デザイン自体は間違っているかもしれませんが、あくまで一例です。

この方法で制約を設定したいと思います。

alter table INSURANCE 
add constraint unique(CUST_ID, CONTRACT_TYPE)
and check (FROM_DATE not between FROM_DATE and TO_DATE)
and check (TO_DATE   not between FROM_DATE and TO_DATE) ;

つまり、期間が互いに交差しない限り、同じ CUST_ID と CONTRACT_TYPE を持つ 2 つの保険を持つことができます。

この種の問題の解決策はありますか?

ヒントをありがとう!

乾杯ムエラ

4

2 に答える 2

1

おそらく、関数ベースの制約が必要になるでしょう。すでに大量のリソースが存在するため、ここでは詳細には触れません。単に「Oracle Function Based Constraint」を Google で検索すれば、十分な情報が得られます。ただし、パフォーマンスへの影響について推測したくはありません-おそらくビジネスロジックである必要があるというあなたの声明は100%正しいと思います。データベースにがらくたデータをスローしないでください。ソースで拒否してください。

于 2014-03-25T11:34:09.603 に答える
1

「before」トリガーを使用できます。トリガーコードで、説明したチェックを実行し、既存の行が見つかった場合は例外を発生させます。

于 2014-03-25T11:51:39.713 に答える