我正在创建一个小型数据库。
我想限制几个表中的数据 - 贷方和Pingtree。 ProviderType表包含查找数据,包含“Lender”或“Pingtree”。如何修改此结构,以便Lender表只能包含Lender类型和Pingtree,Pingtree类型?
答案 0 :(得分:0)
猜测ProviderTypeID
是Provider
表中区分这两种类型的列,那么您必须将同一列添加到Lender
和Pingtree
表中,在Provider
上ID, 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代码。