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
我有一个简单的问题。如何在不将值与其列关联的情况下为 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