sql - 两个字段的唯一约束,以及它们的相反

标签 sql sql-server sql-server-2008 unique

我有一个数据结构,我必须在其中存储成对的元素。每对都恰好有 2 个值,因此我们使用了一个表,其中包含字段(leftvalue,rightvalue....)。 这些对应该是唯一的,并且如果更改了键,则它们被认为是相同的。

Example: (Fruit, Apple) is the same as (Apple, Fruit).

如果可能以一种有效的方式,我会在字段上设置一个数据库约束,但不以任何成本为代价 - 性能更重要。

我们目前使用的是 MSSQL server 2008,但可以进行更新。

有没有一种有效的方法来实现这一点?

最佳答案

两种解决方案,都是为了将​​问题转化为更简单的问题。如果强制消费者进行更改是可以接受的,我通常更喜欢 T1 解决方案:

create table dbo.T1 (
    Lft int not null,
    Rgt int not null,
    constraint CK_T1 CHECK (Lft < Rgt),
    constraint UQ_T1 UNIQUE (Lft,Rgt)
)
go
create table dbo.T2 (
    Lft int not null,
    Rgt int not null
)
go
create view dbo.T2_DRI
with schemabinding
as
    select
        CASE WHEN Lft<Rgt THEN Lft ELSE Rgt END as Lft,
        CASE WHEN Lft<Rgt THEN Rgt ELSE Lft END as Rgt
    from dbo.T2
go
create unique clustered index IX_T2_DRI on dbo.T2_DRI(Lft,Rgt)
go

在这两种情况下,T1T2 都不能在 Lft,Rgt 对中包含重复值。

关于sql - 两个字段的唯一约束,以及它们的相反,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23103462/

相关文章:

sql - 在 Oracle 数据库中更新连接查询结果中每一行的列的最有效方法是什么?

mysql - MySQL 升级后 SELECT 查询花费太长时间

sql-server - 尝试在兼容模式 110 的 SQL Server 2014 上还原 SQL Server 2016 备份时出错

java - Java 连接到 SQL 数据库时出现 Class.forName 错误

sql-server - 存储过程连接上的表参数和列名上的自动增量 id

mysql - 将日期设置为三天前

带有NULL列的SQL联接

sql - 如果未提供,则在 SQL Server 中生成新的 GUID

sql-server-2008 - SQL Server 扩展事件没有更新的事件

sql - 如何在sql中将字符串拆分为变量?