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

时间:2015-02-09 10:40:35

标签: sql-server constraints unique

我有一个简单的问题。如何为表添加唯一约束,而不将值与其列相关联?例如,我有这个表

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

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

CREATE UNIQUE CONSTRAINT AS A SET_CONSTRAINT

2 个答案:

答案 0 :(得分:2)

你可以写一个这样的视图:

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是一个包含两行且具有任意内容的表。如果其中有一行,则应该使唯一索引失败。此视图中的任何行都表示存在唯一性违规。

答案 1 :(得分:1)

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

演示

表架构

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