gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 04:18:22 24 4
gpt4 key购买 nike

friend 们好,

我想知道如何以特殊方式使两列在 SQL Server 中唯一,如下所述。

我想要的方式:

------------------------- 
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.

Steven 是 Johns 的 friend 所以他们是 friend 所以我不想Johns 添加一个新行,说 Johns 是 Steven 的 friend 。

Steven 像这样添加新行:

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

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

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

我希望我的问题很清楚,如果有人对此有好的答案,请帮助我。预先感谢任何答案

最佳答案

做到这一点的直接方法(所有其他条件都相同)是坚持第一列中的值总是排在第二列中的值之前:

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)
)

如果您无法适应这种变化(这很奇怪,因为这表明关系不是对称的),您可以通过索引 View 强制执行:

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')

上面最后的插入会产生一个错误。请注意,对于大多数意图,您忽略 View V1 - 它的存在只是为了强制执行此约束(当我使用此类表时,我通常在它们的名称前加上 DRI_ 以使其很明显,它并不是真正为查询而创建的。

关于sql - 如何使两列在 SQL Server 中是唯一的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15968759/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com