新手急需帮助。
我正在创建一个小型数据库。
我想将数据限制在几个表中 - Lender 和 Pingtree。ProviderType 表包含查找数据并包含“Lender”或“Pingtree”。如何修改此结构,使 Lender 表只能包含 Lender 类型和 Pingtree、Pingtree 类型?
新手急需帮助。
我正在创建一个小型数据库。
我想将数据限制在几个表中 - Lender 和 Pingtree。ProviderType 表包含查找数据并包含“Lender”或“Pingtree”。如何修改此结构,使 Lender 表只能包含 Lender 类型和 Pingtree、Pingtree 类型?
猜测ProviderTypeID
是Provider
表中区分这两种类型的列,那么您必须将同一列添加到Lender
和表中,在onPingtree
中添加合适的键(如果它不存在),然后添加复合约束到包含这些列的和表。Provider
ID, ProviderTypeId
FOREIGN KEY
Lender
Pingtree
虽然这听起来像是拖累,但它是一种称为超类型/子类型的已知模式。当超类型(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 代码应该不必更改。