2010-12-16 57 views
0

假設我有一個包含三列的表:UserId TeamId IsTeamCaptain。如何確保每個TeamId的IsTeamCaptain列中只有一個「真實」值?假設我有五個不同的UserId屬於TeamId 1,那麼在這五個中只能有一個是'true',其餘的必須是'false'。設置在表中的唯一值

回答

3

創建上設置一個獨特的篩選索引(過濾指數是SQL Server 2008中介紹)

+0

我會研究它,謝謝! – 2010-12-16 11:23:46

0
CREATE TABLE [dbo].[SampleTable](
     [UserID] [int] NOT NULL, 
     [TeamID] [int] NOT NULL, 
     [IsTeamCaptain] [bit] NOT NULL) 
go 

create trigger triu_SampleTable on SampleTable 
instead of insert, update 
as 
begin 
set nocount on 

declare @userid int, @teamid int, @isteamcaptain bit, @counter int 

declare cur cursor local fast_forward for 
select userid, teamid, isteamcaptain from inserted 

open cur 

fetch next from cur into @userid, @teamid, @isteamcaptain 
while @@fetch_status = 0 
begin 
if @isteamcaptain = 0 
    insert into Sampletable(userid, teamid, isteamcaptain) 
    values(@userid, @teamid, @isteamcaptain) 
if @isteamcaptain = 1 
    if exists(select * from SampleTable Where teamid = @teamid and isteamcaptain = 1) 
     raiserror('Not allow to add more than 1 captain per team',16,1) 
    else 
     insert into Sampletable(userid, teamid, isteamcaptain) 
     values(@userid, @teamid, @isteamcaptain) 

fetch next from cur into @userid, @teamid, @isteamcaptain 
end 

close cur 
deallocate cur 

end 
Go 

這是一個觸發我們的餐桌上

+0

UNIQUE字段上的約束IsTeamCaptain不允許使用字段IsTeamCaptain的相同值創建多個條目。 – Kutsoff 2010-12-16 11:35:34

+0

啊,我明白了。但是,這是不是使得每個團隊不能有超過一個「虛假」價值? – 2010-12-16 11:36:37

+0

我會做出這樣的觸發器 – Kutsoff 2010-12-16 12:16:15