我有一个简单的问题。如何为表添加唯一约束,而不将值与其列相关联?例如,我有这个表
ID_A ID_B
----------
1 2
... ...
在那个例子中,我有记录(1,2)。对我来说,(1,2)=(2,1)。所以我不想让我的数据库存储这两个值。我知道我可以使用,触发器或检查和功能完成它。但我想知道是否有任何类似的指导
CREATE UNIQUE CONSTRAINT AS A SET_CONSTRAINT
答案 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