2011-06-12 6 views
5

私は3つのテーブルを持っています。基本表とそれを表Aと呼び、表Aを参照する2つの表を表Xと表Yと呼んでいます.XとYの両方に表Aを参照する外部キー制約があります.XとYの外部キーも独自のものです主キー。2つのテーブルのうちの1つがベーステーブルを参照することを許可する制約。

これらのテーブルの1つにテーブルAを参照するレコードしか含まれないようにする制約を追加することができるかどうかを知りたいのですが。XがAを参照するレコードを持つ場合、YにはもしYがAを参照するレコードを持っていれば、Xはそれを持つことができません。

これは可能ですか?

おかげで、

+0

私はあなたのユースケースについて興味があります。あなたの構造について何か__interesting__があります。同じキー値を使用する3つの主キーがあります。 – NullRef

+0

はい、ユーザーアカウントを格納するための3つのテーブルです。アカウントには2つのタイプがあります。したがって、両方のタイプのアカウントに共通する情報を含む基本テーブルと、そのアカウントタイプに固有の情報を保持する各アカウントタイプのテーブルがあります。だから、各テーブルのPKはUserIDです。なぜなら、これは物事が一貫していて、UserIDでレコードに簡単にアクセスできると思ったからです。 –

答えて

7

UDFの制約条件(Odedの答え)は、スケールがよくなく、並行性が悪いです。これらを参照してください:だから

  • は新しいテーブルを作成し、言うTableA2XY
  • このテーブルAのPKと文字を持っている(1)列には、XまたはYの1つを許可するCHECKが付いています.AのPKにも一意の制約があります。
  • TABLEXとTableyのそれぞれのみXまたはYを可能にするためにチェックして、新しいCHAR(1)カラムを有する
  • TABLEXとTableyのは、両方の列

これはスーパーキーまたはサブタイプのアプローチである上TableA2XYへのFKを有します

  • すべてDRIベース
  • なしには、CHECK制約でテーブルアクセス
  • 何のUDFをトリガしません。
+0

私はあなたが説明したものとほぼ同じことをやっています。最近私は、子プロンプトで自動的に生成された列リストに表示されないように、永続化された計算されたCHAR(1)列を私の子テーブルに追加しました。 –

1

はい、これはCHECK constraintsを使用して可能です。

通常の外部キー制約とは別に、両方の参照テーブルにCHECK constraintを追加して、他の参照テーブルで外部キーが使用されていないことを確認する必要があります。

+0

CHECKには安全ではなく、遅いスカラーudfが必要です。私の答えをご覧ください。 – gbn

関連する問題