SQL Server 2008:与列无关的值的唯一约束

SQL Server 2008: Unique constraint for values non-related with columns

我有一个简单的问题。如何在不将值与其列关联的情况下为 table 添加唯一约束?例如,我有这个 table

ID_A  ID_B
----------
  1    2
 ...  ...

在那个例子中,我有记录 (1,2)。对我来说,(1,2) = (2,1)。所以我不想让我的数据库存储这两个值。我知道我可以使用触发器或检查和功能来完成它。但是我想知道有没有像

这样的说明
CREATE UNIQUE CONSTRAINT AS A SET_CONSTRAINT

你可以这样写一个视图:

select 1 as Dummy
from T t1
join T t2 on t1.ID1 = t2.ID2 AND t1.ID2 = t2.ID1 --join to corresponding row
cross join TwoRows

并在 Dummy 上创建唯一索引。 TwoRows 是一个 table,包含两行任意内容。如果其中有一行,它应该使唯一索引失败。此视图中的任何行都表示唯一性违规。

您可以使用 Instead of Insert 触发器执行此操作。

演示

Table 架构

CREATE TABLE te(ID_A INT,ID_B INT)

INSERT te VALUES ( 1,2)

触发器

Go
CREATE TRIGGER trg_name
ON te
instead OF INSERT
AS
  BEGIN
      IF EXISTS (SELECT 1
                 FROM   inserted a
                 WHERE  EXISTS (SELECT 1
                                FROM   te b
                                WHERE  ( ( a.id_a = b.id_b
                                           AND a.id_b = b.id_a )
                                          OR ( a.id_a = b.id_a
                                               AND a.id_b = b.id_b ) )))
        BEGIN
            PRINT 'duplciate record'
            ROLLBACK
        END
      ELSE
        INSERT INTO te
        SELECT Id_a,id_b
        FROM   inserted
  END

SELECT * FROM   te

插入脚本

INSERT INTO te VALUES (2,1) -- Duplicate

INSERT INTO te VALUES (1,2) --Duplicate

INSERT INTO te VALUES (3,2) --Will work