如何修改此SQL架构以约束表中的数据?

时间:2013-05-21 19:48:14

标签: sql-server constraints

新手需要帮助。

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

enter image description here

我想限制几个表中的数据 - 贷方和Pingtree。 ProviderType表包含查找数据,包含“Lender”或“Pingtree”。如何修改此结构,以便Lender表只能包含Lender类型和Pingtree,Pingtree类型?

1 个答案:

答案 0 :(得分:0)

猜测ProviderTypeIDProvider表中区分这两种类型的列,那么您必须将同一列添加到LenderPingtree表中,在ProviderID, ProviderTypeId添加一个合适的密钥(如果它尚不存在),然后向FOREIGN KEY和{{1}添加一个复合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); 上指定列列表),则不必更改存储过程和应用程序SQL代码。