2010-12-16 7 views
0

UserId TeamId IsTeamCaptain이라는 세 개의 열이있는 테이블이 있다고 가정 해 보겠습니다. TeamId 당 IsTeamCaptain 열에 '참'값이 하나 뿐인 것을 어떻게 확인할 수 있습니까? 그래서 저는 TeamId 1에 속한 5 개의 다른 UserId를 가지고 있다고 가정 해 봅니다. 그런 다음이 5 개에는 'true'가 하나 뿐이지 만 나머지는 'false'여야합니다.테이블에있는 고유 한 값

답변

3

이 설정에 고유 필터링 된 인덱스 만들기

+0

나는 그것으로 볼 것입니다, 감사합니다! –

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 

는 트리거가 우리 테이블에의 (필터링 된 인덱스는 SQL 서버 2008에서 소개)

+0

UNIQUE 필드에 대한 제약 IsTeamCaptain은 IsTeamCaptain 필드와 동일한 값을 가진 하나 이상의 엔트리를 생성하는 것을 허용하지 않습니다. – Kutsoff

+0

아, 알겠습니다. 그러나 이것이 팀 당 하나 이상의 '거짓'값을 가질 수 없도록 만들지 않습니까? –

+0

이 같은 트리거를 만들었을 것입니다 – Kutsoff