web-dev-qa-db-ja.com

SQL Serverのビューの列を参照する外部キーを使用できますか?

SQL Server 2008では、与えられた

_TableA(A_ID, A_Data)
TableB(B_ID, B_Data)
ViewC(A_or_B_ID, A_or_B_Data)
_

_Z.A_or_B_ID_列がViewCで見つかった値に制約されるようにTableZ(A_or_B_ID, Z_Data)を定義することは可能ですか?これは、ビューに対する外部キーを使用して実行できますか?

81
marc

外部キーでビューを参照することはできません。

101
Brian Fisher

古いSQL Serverエディションでは、外部キーはトリガーを介してのみ可能でした。挿入された値が関連するテーブルのいずれかに表示されるかどうかを確認する挿入トリガーを作成することにより、カスタム外部キーを模倣できます。

24
lorin_f

TableZでA_or_B_IDが本当に必要な場合、2つの同様のオプションがあります。

1)null許容のA_IDおよびB_ID列をテーブルzに追加し、これら2つの列でISNULLを使用してA_or_B_IDを計算列にし、A_IDまたはB_IDのいずれか1つだけがnullでないようにCHECK制約を追加します

2)TableNameカラムをテーブルzに追加し、AまたはBのいずれかを含むようにします。今度はA_IDおよびB_IDを計算カラムとして作成します。それらも永続化する

どちらの場合も、ベーステーブルへの適切な外部キーを持つことができるA_IDおよびB_ID列があります。違いは、計算される列です。また、2つのID列のドメインが重複しない場合は、上記のオプション2でTableNameは必要ありません-ケース式がどのドメインA_or_B_IDに該当するかを決定できる限り

(書式設定を修正するためのコメントをありがとう)

15

申し訳ありませんが、SQL ServerのビューにFKすることはできません。

8
Jarrett Meyer

別のオプションがあります。 TableAとTableBを、TablePrimeと呼ばれる新しいテーブルのサブクラスとして扱います。 TableAのID値と一致しないようにTableBのID値を調整します。 TablePrimeのIDをPKにして、TableAとTableBのすべての(調整済み)IDをTablePrimeに挿入します。 TableAおよびTableBのPKでTablePrimeの同じIDとのFK関係を作成します。

これでスーパータイプ/サブタイプパターンが得られ、TablePrime(必要な場合either-A-or-B)または個々のテーブルの1つ(必要な場合Aのみ)またはBのみ)。

詳細が必要な場合はお問い合わせください。 AとBが相互に排他的であることを確認できるバリエーションがあります。または、作業しているものが両方同時にある場合もあります。可能であれば、それをFKで形式化することをお勧めします。

4
ErikE

申し訳ありませんが、Wordの厳密な意味では、ビューに外部キーを設定することはできません。その理由は次のとおりです。

InnoDBは、外部キーを備えたMySQL用の唯一の組み込みストレージエンジンです。 InnoDBテーブルは、engine = 'InnoDB'でinformation_schema.tablesに登録されます。

Information_schema.tablesに登録されているビューには、NULLストレージエンジンがあります。 MySQLには、未定義のストレージエンジンを持つテーブルに外部キーを保持するメカニズムはありません。

ありがとう!

チェックを行うユーザー定義関数、値が存在する場合はtrue、存在しない場合はfalseを返すfCheckIfValueExists(columnValue)を参照する制約を追加する方が簡単です。

利点は、複数の列を受け取り、それらで計算を実行し、nullを受け入れ、主キーに正確に対応しない値を受け入れたり、結合の結果と比較したりできることです。

欠点は、オプティマイザがすべての外部キートリックを使用できないことです。

1
Camilo J