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)
を定義することは可能ですか?これは、ビューに対する外部キーを使用して実行できますか?
外部キーでビューを参照することはできません。
古いSQL Serverエディションでは、外部キーはトリガーを介してのみ可能でした。挿入された値が関連するテーブルのいずれかに表示されるかどうかを確認する挿入トリガーを作成することにより、カスタム外部キーを模倣できます。
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
に該当するかを決定できる限り
(書式設定を修正するためのコメントをありがとう)
申し訳ありませんが、SQL ServerのビューにFKすることはできません。
別のオプションがあります。 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で形式化することをお勧めします。
申し訳ありませんが、Wordの厳密な意味では、ビューに外部キーを設定することはできません。その理由は次のとおりです。
InnoDBは、外部キーを備えたMySQL用の唯一の組み込みストレージエンジンです。 InnoDBテーブルは、engine = 'InnoDB'でinformation_schema.tablesに登録されます。
Information_schema.tablesに登録されているビューには、NULLストレージエンジンがあります。 MySQLには、未定義のストレージエンジンを持つテーブルに外部キーを保持するメカニズムはありません。
ありがとう!
チェックを行うユーザー定義関数、値が存在する場合はtrue、存在しない場合はfalseを返すfCheckIfValueExists(columnValue)を参照する制約を追加する方が簡単です。
利点は、複数の列を受け取り、それらで計算を実行し、nullを受け入れ、主キーに正確に対応しない値を受け入れたり、結合の結果と比較したりできることです。
欠点は、オプティマイザがすべての外部キートリックを使用できないことです。