【问题标题】:SQL Server 2008: Unique constraint for values non-related with columnsSQL Server 2008:与列无关的值的唯一约束
【发布时间】:2015-02-09 10:40:35
【问题描述】:

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

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

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

CREATE UNIQUE CONSTRAINT AS A SET_CONSTRAINT

【问题讨论】:

  • 只有两列吗?您可以使用索引视图强制执行此操作。这些列是否也是唯一的?
  • 是的,只有两列。我有一张桌子,只有这些列。两者都是同一张表的外键,并且都是主键。所以这些列本身并不是唯一的。例如我可以有这个记录 (1,2),(1,3),(2,2)

标签: sql-server constraints unique


【解决方案1】:

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

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

【讨论】:

  • 感谢您的评论。这可能是实现我的要求的一种非常快速的方法,无需编写触发器来插入和更新。
  • 哇,我从来没有考虑过。不错!
【解决方案2】:

您可以使用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

【讨论】:

  • 什么是插入的表我没给你
  • @koushikveldanda - 这可能对你有帮助msdn.microsoft.com/en-IN/library/ms191300.aspx
  • @NoDisplayName 感谢您的评论。当我想到上面的问题时,这是我正在开发的解决方案。我认为这可能是一种更快的方法,例如,将唯一约束中的行视为集合。
  • @Rumpel - 你在这里是什么意思?我没找到你
  • @NoDisplayName 别担心,这可能是我的英语。当我谈到将行视为一个集合时,我的意思是一个数学集合:en.wikipedia.org/wiki/Set_(mathematics) 如果您设置了一个唯一约束,并且您尝试插入此记录 (1,2)。数据库将检查是否没有 ID_A=1 和 ID_B=2 的其他列。但我想知道,是否有任何方法可以检查是否没有其他 ID_A=2 和 ID_B=1 的列。在数学中,当你定义一个集合时,{1,2} = {2,1}。正如我所说,我知道如何使用触发器来完成它,但我认为,默认情况下可能有一种方法可以做到这一点。我知道我错了
猜你喜欢
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 2011-01-11
相关资源
最近更新 更多