助けが必要な初心者。
小さなデータベースを作成しています。
Lender と Pingtree の 2 つのテーブルでデータを制約したいと考えています。ProviderType テーブルにはルックアップ データが含まれており、「Lender」または「Pingtree」のいずれかが含まれています。Lender テーブルに Lender タイプと Pingtree、Pingtree タイプのみを含めることができるように、この構造を変更するにはどうすればよいですか?
助けが必要な初心者。
小さなデータベースを作成しています。
Lender と Pingtree の 2 つのテーブルでデータを制約したいと考えています。ProviderType テーブルにはルックアップ データが含まれており、「Lender」または「Pingtree」のいずれかが含まれています。Lender テーブルに Lender タイプと Pingtree、Pingtree タイプのみを含めることができるように、この構造を変更するにはどうすればよいですか?
これが 2 つのタイプを区別するテーブルProviderTypeID
の列であると推測すると、この同じ列をとテーブルの両方に追加し、適切なキー (まだ存在しない場合) をonに追加してから、複合制約を追加する必要があります。これらの列を含む および テーブルに。Provider
Lender
Pingtree
Provider
ID, ProviderTypeId
FOREIGN KEY
Lender
Pingtree
これは難しそうに聞こえるかもしれませんが、スーパータイピング/サブタイピングと呼ばれる既知のパターンです。TypeId
スーパータイプ (プロバイダ) が複数のサブタイプになる場合、列は必要ありません。しかし、サブタイプが相互に排他的である場合、これはあなたがしなければならないことです。
次のようになります。
ALTER TABLE dbo.Lender ADD ProviderTypeId tinyint NOT NULL
CONSTRAINT DF_Lender_ProviderTypeID DEFAULT (1)
CONSTRAINT CK_Lender_ProviderTypeID_Is_Lender CHECK (ProviderTypeID = 1);
ALTER TABLE dbo.Pingtree ADD ProviderTypeId tinyint NOT NULL
CONSTRAINT DF_Pingtree_ProviderTypeID DEFAULT (2)
CONSTRAINT CK_Pingtree_ProviderTypeID_Is_Pingtree CHECK (ProviderTypeID = 2);
-- Any of a PK, UNIQUE constraint, or unique index will do
ALTER TABLE dbo.Provider ADD CONSTRAINT UQ_Provider_ID_ProviderTypeID
UNIQUE (ID, ProviderTypeID);
ALTER TABLE dbo.Lender DROP CONSTRAINT FK_Lender_ProviderId;
ALTER TABLE dbo.Lender ADD CONSTRAINT FK_Lender_ProviderId_ProviderTypeId
FOREIGN KEY (ID, ProviderTypeID) REFERENCES dbo.Provider (ID, ProviderTypeID);
ALTER TABLE dbo.PingTree DROP CONSTRAINT FK_PingTree_ProviderId;
ALTER TABLE dbo.PingTree ADD CONSTRAINT FK_PingTree_ProviderId_ProviderTypeId
FOREIGN KEY (ID, ProviderTypeID) REFERENCES dbo.Provider (ID, ProviderTypeID);
正しく記述されている場合 ( で列リストを指定している場合INSERT
)、ストアド プロシージャとアプリケーション SQL コードを変更する必要はありません。