2014-02-24 89 views
1

我有一個客戶表,通過中間CustomerAddress錶鏈接到地址表。這意味着客戶可以擁有許多地址,並且地址可以擁有許多客戶。 (這是必要的,因爲我們將配偶和子女作爲單獨的顧客處理,並且每個人都可以有送貨,工作,賬單和其他地址)。複雜檢查約束?

我希望客戶能夠指定首選地址。

我的想法是在客戶表中創建一個鏈接到CustomerAddress記錄的新列。

我的問題是 - 如何確保選定的首選地址是客戶地址之一?

我的想法是在customers.preferredAddress字段上設置Check約束,該字段檢查給定的CustomerAddress以查看記錄的客戶ID是否與正在更新的客戶匹配。

這可能嗎?我只用過CHECK約束檢查一樣簡單的東西(值> 0)等

感謝您的幫助

+0

爲什麼在顧客桌上?客戶地址記錄上的新列是「首選地址」,並且是一個簡單的y/n(或位)來定義yes或no(或null爲否)?如果它位於customeraddress表上,則強制執行它是客戶地址之一的關係。 – Twelfth

+0

但是,我怎麼能阻止一個客戶有多個首選地址? –

回答

5

寫UDF驗證地址的所有權,然後引用該UDF從檢查約束。

CREATE FUNCTION dbo.fnIsAddressOwner (
    @CustomerId int, 
    @AddressId int 
) 
RETURNS tinyint 
AS 
BEGIN 
    DECLARE @Result tinyint 
    IF EXISTS(SELECT * FROM CustomerAddresses WHERE [email protected] and [email protected]) 
    SET @Result= 1 
    ELSE 
    SET @Result= 0 
    RETURN @Result 
END 


CREATE TABLE Customers (
    CustomerId int, 
    PreferredAddressId int, 
    CONSTRAINT ckPreferredAddressId CHECK (
    dbo.fnIsAddressOwner(CustomerId, PreferredAddressId) = 1) 
) 
) 
+0

如果檢查約束不適用於您,那麼您也可以在觸發器中執行檢查。如果驗證失敗,請回滾事務。 – Keith

+1

當然,上述內容中的任何內容都不允許「UPDATE CustomerAddresses set CustomerId = 」,其中CustomerId =​​「現在違反了」約束「。 –