2010-12-16 54 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