ビューには独自の外部キー制約が必要ですか?


10

免責事項:私はDBAではなくプログラマーなので、我慢してください...

2つのエンティティを一緒にマッピングするために使用するビューがあります。それを取得するには、いくつかの異なるテーブル間で結合を行う必要があります。

CREATE OR REPLACE VIEW V_SCREENING_GROUP_SITES AS (
SELECT SG.SCREENING_GROUP_ID, V.SITE_ID
FROM SCREENING_GROUP SG, VISIT V, VISIT_DATE VD
WHERE VD.VISIT_ID = V.VISIT_ID 
AND V.SCREENING_GROUP_ID = SG.SCREENING_GROUP_ID);

上記は説明用です。あまり気にしないでください。私が知る必要があるのは、新しいV_SCREENING_GROUP_SITESビューのフィールド(SCREENING_GROUP_IDおよびSITE_ID)を、SCREENING_GROUPおよびSITEテーブルへの外部キーとして動作させる方法です。それとも問題ですか?

それがテーブルだったとしたら、

ALTER TABLE V_SCREENING_GROUP_SITES
ADD CONSTRAINT FK_SCREENING_GROUP_ID
FOREIGN KEY (SCREENING_GROUP_ID)
REFERENCES SCREENING_GROUP.SCREENING_GROUP_ID;
...

しかし、それは明らかに機能しないビューなので、FKを設定するために機能するALTER VIEW構文が見つかりませんでした。私は何をすべきか?

(これはMySQLデータベースです)

回答:


12

ビューは、1つ以上の物理テーブルに基づく論理テーブルです。基になるテーブルに外部キー関係がある場合、それらはビューに表示されます。ビューは派生元のテーブルに完全に依存しているため、ビューに外部キーを追加することはできません。


1
すばらしいので、その後何もする必要はありません(FK制約は、基になるテーブルに既に存在します)。答えてくれてありがとう。
Troy

1
これがポイントだと思います。基になるテーブルにFKがある限り、ビューにFKは必要ありません。
デレクダウニー2011

2
@DTest-チェック、一意キー、外部キーなどの制約をビューに適用できると便利です(特にビューがデータを集約する場合)。現在のRDBMSでは、ビューの作成を許可している場合でも、ビューに制約を課すことはありません。
ジャックはtopanswers.xyzを試してみる

@JackDouglasまさにその通り!実際、MySQLがそのような機能をサポートしているかどうかを調べるためにここに来ました。
Stijn de Witt 2017

3

厳密に言えば、ビューに外部キーを設定することはできません。理由は次のとおりです。

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.