-1

助けが必要な初心者。

小さなデータベースを作成しています。

ここに画像の説明を入力

Lender と Pingtree の 2 つのテーブルでデータを制約したいと考えています。ProviderType テーブルにはルックアップ データが含まれており、「Lender」または「Pingtree」のいずれかが含まれています。Lender テーブルに Lender タイプと Pingtree、Pingtree タイプのみを含めることができるように、この構造を変更するにはどうすればよいですか?

4

1 に答える 1

0

これが 2 つのタイプを区別するテーブルProviderTypeIDの列であると推測すると、この同じ列をとテーブルの両方に追加し、適切なキー (まだ存在しない場合) をonに追加してから、複合制約を追加する必要があります。これらの列を含む および テーブルに。ProviderLenderPingtreeProviderID, ProviderTypeIdFOREIGN KEYLenderPingtree

これは難しそうに聞こえるかもしれませんが、スーパータイピング/サブタイピングと呼ばれる既知のパターンです。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 コードを変更する必要はありません。

于 2013-05-21T20:19:34.920 に答える