-1
需要幫助的新手。如何修改此SQL模式以約束表中的數據?
我正在創建一個小型數據庫。
我想在情侶對錶的約束數據 - 貸款和Pingtree。 ProviderType表包含查找數據幷包含'貸方'或'Pingtree'。我如何修改這個結構,使貸方表只能包含貸方類型和Pingtree,Pingtree類型?
需要幫助的新手。如何修改此SQL模式以約束表中的數據?
我正在創建一個小型數據庫。
我想在情侶對錶的約束數據 - 貸款和Pingtree。 ProviderType表包含查找數據幷包含'貸方'或'Pingtree'。我如何修改這個結構,使貸方表只能包含貸方類型和Pingtree,Pingtree類型?
猜測ProviderTypeID
在Provider
表兩種類型區分列,那麼你必須在此同一列添加到Lender
和Pingtree
表都加一個合適的鍵(如果它不存在)在Provider
on 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代碼應該不會有改變。
謝謝埃裏克 - 剛試過,工作很好 – dotnetnoob