我使用的是sql server 2008,我的列是nvarchar(max)。 如何使用触发器模拟该列中的唯一约束?
这甚至可能吗?
答案 0 :(得分:2)
使用HashBytes创建列的哈希并在其上放置唯一约束。使用SHA或MD5,您不会发生意外碰撞(但如果您真的偏执,请使用两个不同算法的两个哈希!)。
答案 1 :(得分:1)
根据Joe Why can't I put a constraint on nvarchar(max)?的链接,您无法创建唯一约束。
但是,您可以添加COMPUTED
列,其中只包含前800个(nvarchar)字符和唯一索引。
您可以通过获取nvarchar(max)列的checksum
或hashbytes
(或两者)并创建唯一的(第一个800 +哈希)来强化它
不要采用校验和或哈希字节alone
,因为冲突是常见的,您甚至会拒绝非重复项。
编辑:要获得更好的方法,请使用此方法
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
是计算列
如果您发现任何记录,则存在“唯一约束”违规行为