2012-12-18 24 views
1

我有以下表中的SQL Server應用自定義約束在SQL Server數據庫

Create Table Banners 
    (
    BannerID int Identity(1,1), 
    BannerUrl nvarchar(500), 
    BannerIsDomestic bit, 
    BannerName nvarchar(50), 
    CreationDate datetime, 
    ModificationDate datetime, 
    Show_Status bit, 
    Remark nvarchar(500) 
    Constraint Banner_ID_PK Primary Key (BannerID) 
    ) 

在此我想申請一個定製的約束一樣,在同一時間只有兩排可以有Show_Status是真實的。一個與BannerIsDomestic = true和一個與BannerIsDomestic = false

對於所有具有BannerIsDomestic = true的行,只能有一個Show_Status = True,其他所有行必須爲false。

對於所有具有BannerIsDomestic = false的行,只有一行可以有Show_Status = True,其他所有行必須是假的。

我可以在SQL Server中執行此操作嗎?

+0

除了觸發器,我不認爲有任何的方式來實現這一目標。 –

回答

1

如果我理解正確的要求,這應該是可以實現與filtered indexes

CREATE TABLE Banners 
    (
    BannerID int Identity(1,1), 
    BannerUrl nvarchar(500), 
    BannerIsDomestic bit, 
    BannerName nvarchar(50), 
    CreationDate datetime, 
    ModificationDate datetime, 
    Show_Status bit, 
    Remark nvarchar(500) 
    Constraint Banner_ID_PK Primary Key (BannerID) 
    ) 

CREATE UNIQUE NONCLUSTERED INDEX IX_Banners_IsDomesticTrue 
ON Banners (BannerIsDomestic) WHERE Show_Status = 1 

INSERT Banners (BannerIsDomestic, BannerName, Show_Status) 
VALUES (1, 'DomesticBannerShow', 1), (1, 'DomesticBannerHide', 0), 
(0, 'ItnlBannerShow', 1), (0, 'IntlBannerHide', 0) 

-- This will fail 
INSERT Banners (BannerIsDomestic, BannerName, Show_Status) 
VALUES (1, 'DomesticBanner2', 1) 

-- This will fail 
INSERT Banners (BannerIsDomestic, BannerName, Show_Status) 
VALUES (0, 'IntlBanners2', 1) 
+2

一個簡單的過濾索引就足夠了 - 'ON Banners(BannerIsDomestic)WHERE Show_Status = 1'。 –

+0

我在那裏感覺很聰明。作爲@達米安的觀察是正確的編輯答案。 – 8kb