美好的一天朋友,
我想知道如何在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 }
我的问题很明确,如果有人知道这个问题的答案,请帮助我。
提前感谢您的回答
答案 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)
我认为,因为主键不起作用,你必须使用触发器来检查该行是否已经存在。