2017-12-03 4 views
3

私はSuperPersonテーブルとDisasterテーブルを持つ実践的なSuper Hero SQLデータベースを持っています。 SuperPersonとDisaster、CreateとPreventの2つの関係があります。 SuperPersonテーブルには、悪意のあるか良いかどうかを示すDispositionカラムがあります。どのようにして、良い関係のスーパー・パーソンだけが、関係を作るために予防関係に参加することができるようにすることができますか?特定の要件を満たしている場合にのみエンティティがリレーションシップに参加できるSQL

SuperPersonテーブルを参照する2つの新しいテーブル、SuperHeroおよびSuperVillianを作成することを考えましたが、これは最も論理的なことですか、この制約を適用するために使用できるPL/SQLはありますか?

編集:

add constraint fk_disaster_create 
    foreign key (create, 'good') references superperson (superpersonid, disposition); 

は残念ながら、定数はこのような参照のために許可されていません: Here's a link to a schema of the database so far

+0

、それはあなたのデータモデルは、エンティティの二つの異なる種類のconflatingされていることは良い兆候です。制約を適用するために必要なPL/SQLは、通常、単純に2つの表を持つより複雑です。 –

+0

@JeffreyKempこれは当てはまりますが、ここではSuperPersonをSuperHeroとSuperVillianに分けることになります。これはテーブルの無駄ですか? –

+0

あなたは 'Prevent'関係を作成している間に' SuperPerson'を良いものに問い合わせることができ、 'Create'のためにその逆を行うことができます。エンティティレベルで制約を設定したいのはなぜですか? – Aman

答えて

1

の理想のように外部キーを定義することです。一つの方法は、二つの値で固定列を定義することです:唯一の特定のメンバーが関係に参加できる場合

alter table disaster add disposition_good varchar2(255) default 'good'; 
alter table disaster add disposition_evil varchar2(255) default 'evil'; 

alter table disaster add constraint fk_disaster_create 
    foreign key (create, 'good') references superperson (superpersonid, disposition); 
+0

トリガーを使って、入力されたスーパー人物の処分が良いか悪いかをチェックし、そうでない場合はエラーを投げることができますか? @JackCassidy。 –

+0

。 。もちろん、代わりにトリガーを使用することができます。 –

+0

トリガーが参照している以外の表の属性の値をチェックすることはできますか?たとえば、行がHeroDisasterテーブルに挿入されると、対応するSuperIDを持つSuperPersonテーブルのDispositionの値を尋ねることはできますか? –

関連する問題