使用触发器模拟唯一约束

时间:2011-01-24 22:33:20

标签: sql sql-server

我使用的是sql server 2008,我的列是nvarchar(max)。 如何使用触发器模拟该列中的唯一约束?

这甚至可能吗?

2 个答案:

答案 0 :(得分:2)

使用HashBytes创建列的哈希并在其上放置唯一约束。使用SHA或MD5,您不会发生意外碰撞(但如果您真的偏执,请使用两个不同算法的两个哈希!)。

答案 1 :(得分:1)

根据Joe Why can't I put a constraint on nvarchar(max)?的链接,您无法创建唯一约束。

但是,您可以添加COMPUTED列,其中只包含前800个(nvarchar)字符和唯一索引。

您可以通过获取nvarchar(max)列的checksumhashbytes(或两者)并创建唯一的(第一个800 +哈希)来强化它

不要采用校验和或哈希字节alone,因为冲突是常见的,您甚至会拒绝非重复项。

编辑:要获得更好的方法,请使用此方法

  • 将前8000个字符的HASHBYTE作为COMPUTED列并将其编入索引
  • 在触发器中,您可以使用INSERTED行文本的HASHBYTE作为快速过滤器来缩小需要检查重复项的实际记录
    SELECT ..
    FROM TBL T JOIN INSERTED I ..
    WHERE HASHBYTE(I.vcmax) = T.ComputedHB
      AND I.vcmax = T.vcmax
      AND I.ID != T.ID   -- exclude self

注意 - ComputedHB是计算列

如果您发现任何记录,则存在“唯一约束”违规行为