-1

新手急需帮助。

我正在创建一个小型数据库。

在此处输入图像描述

我想将数据限制在几个表中 - Lender 和 Pingtree。ProviderType 表包含查找数据并包含“Lender”或“Pingtree”。如何修改此结构,使 Lender 表只能包含 Lender 类型和 Pingtree、Pingtree 类型?

4

1 回答 1

0

猜测ProviderTypeIDProvider表中区分这两种类型的列,那么您必须将同一列添加到Lender和表中,在onPingtree中添加合适的键(如果它不存在),然后添加复合约束到包含这些列的和表。ProviderID, ProviderTypeIdFOREIGN KEYLenderPingtree

虽然这听起来像是拖累,但它是一种称为超类型/子类型的已知模式。当超类型(Provider)可以是多个子类型时,不需要该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 回答