如何使两列在SQL Server中是唯一的?

时间:2013-04-12 10:16:36

标签: sql sql-server

美好的一天朋友,

我想知道如何在SQL服务器中以特殊方式创建两列是唯一的,如下所述。

我想要的方式:

------------------------- 
  User    | Friend      |  
-------------------------
  Stevan  | Johns     } 
  William | David     }This is how I want two columns to be unique. 

我不想要的方式:

-------------------------
  User    | Friend    | 
-------------------------
 Steven   | Johns     }   
 Johns    | Steven    }This must not allow.
史蒂文是约翰斯的朋友 所以他们是朋友,所以我不想要 约翰斯补充说,约翰斯是史蒂文的朋友。

史蒂文像这样添加新行:

-------------------------
  User    | Friend    | 
-------------------------
 Steven   | Johns     }   

我不希望john再次添加一行像这样

-------------------------
  User    | Friend    | 
-------------------------
 Steven   | Johns     }   
 Johns    | Steven    }
我的问题很明确,如果有人知道这个问题的答案,请帮助我。 提前感谢您的回答

2 个答案:

答案 0 :(得分:3)

执行此操作的直接方法(所有其他条件相同)是坚持第一列中的值始终排在第二列中的值之前:

CREATE TABLE Friends (
    Party1 varchar(20) not null,
    Party2 varchar(20) not null,
    constraint CK_Friend_Parties CHECK (Party1 < Party2),
    constraint CK_Friends_Unique UNIQUE (Party1,Party2)
)

如果您无法适应此更改(这很奇怪,因为它表明关系不对称),您可以通过索引视图强制执行此更改:

create table dbo.T1 (
    Party1 varchar(20) not null,
    Party2 varchar(20) not null
)
go
create view dbo.V1
with schemabinding
as
    select
        CASE WHEN Party1 < Party2 THEN Party1 else Party2 END as NormParty1,
        CASE WHEN Party1 < Party2 THEN Party2 else Party1 END as NormParty2
    from
        dbo.T1
go
create unique clustered index IX_V1 on dbo.V1 (NormParty1,NormParty2)
go
insert into dbo.T1 (Party1,Party2) values ('Steven','John')
go
insert into dbo.T1 (Party1,Party2) values ('John','Steven')

上面的最终插入会产生错误。请注意,对于大多数意图,您忽略视图V1 - 它仅用于强制执行此约束(当我使用此类表时,我通常在其名称前添加DRI_以明确表示它不是'真的被创造出来被查询。

答案 1 :(得分:-1)

我认为,因为主键不起作用,你必须使用触发器来检查该行是否已经存在。