SQL Server2008では
TableA(A_ID, A_Data)
TableB(B_ID, B_Data)
ViewC(A_or_B_ID, A_or_B_Data)
列がで見つかった値に制約されるTableZ(A_or_B_ID, Z_Data)
ように定義することは可能ですか?これは、ビューに対して外部キーを使用して実行できますか?Z.A_or_B_ID
ViewC
回答:
外部キーでビューを参照することはできません。
古いSQLServerエディションでは、外部キーはトリガーを介してのみ可能でした。挿入された値が関連するテーブルの1つにも表示されるかどうかをチェックする挿入トリガーを作成することにより、カスタム外部キーを模倣できます。
A_or_B_ID
TableZが本当に必要な場合は、次の2つの同様のオプションがあります。
1)null許容列A_ID
とB_ID
列をテーブルzにA_or_B_ID
追加し、これら2つの列にISNULLを使用して計算列を作成し、一方のみがA_ID
またはB_ID
nullでないます。
2)AまたはBのいずれかが今作成含むように制約、表zにテーブル名の列を追加A_ID
し、B_ID
適切なテーブルに名前が付けられている場合にのみnull以外の列を、計算列として(CASE式を使用)。それらも持続させる
どちらの場合も、ベーステーブルへの適切な外部キーを持つことができる列がA_ID
ありB_ID
ます。違いは、列の計算方法です。また、2つのID列のドメインが重複しない場合は、上記のオプション2のTableNameは必要ありません。ただし、ケース式でどのドメインを判別できるかを判断できます。A_or_B_ID
が該当する
(私のフォーマットを修正してくれたコメントに感謝します)
A_or_B_ID
申し訳ありませんが、SQLServerのビューにFKすることはできません。
別のオプションがあります。TableAとTableBをTablePrimeと呼ばれる新しいテーブルのサブクラスとして扱います。TableBのID値を調整して、TableAのID値と一致しないようにします。TablePrimeのIDをPKにし、TableAとTableBの(調整済み)IDをすべてTablePrimeに挿入します。TableAとTableBが、TablePrimeの同じIDに対してPKでFK関係を持つようにします。
これでスーパータイプ/サブタイプパターンが作成され、TablePrime(-Aまたは-Bが必要な場合)または個々のテーブルの1つ(AのみまたはBのみが必要な場合)に制約を加えることができます。。
詳細が必要な場合はお問い合わせください。AとBが相互に排他的であることを確認できるバリエーションがあります。または、作業しているものが同時に両方である可能性があります。可能であれば、FKでそれを形式化するのが最善です。
チェックを行うユーザー定義関数を参照する制約を追加する方が簡単です。fCheckIfValueExists(columnValue)は、値が存在する場合はtrueを返し、存在しない場合はfalseを返します。
利点は、複数の列を受け取り、それらを使用して計算を実行し、nullを受け入れ、主キーに正確に対応しない値を受け入れたり、結合の結果と比較したりできることです。
欠点は、オプティマイザがすべての外部キートリックを使用できないことです。
申し訳ありませんが、厳密な意味では、ビューに外部キーを設定することはできません。理由は次のとおりです。
InnoDBは、外部キーを備えたMySQLの唯一の組み込みストレージエンジンです。すべてのInnoDBテーブルは、engine = 'InnoDB'でinformation_schema.tablesに登録されます。
ビューは、information_schema.tablesに登録されていますが、NULLストレージエンジンを備えています。MySQLには、未定義のストレージエンジンを持つテーブルに外部キーを持つメカニズムはありません。
ありがとう!