使varchar(500)数据列唯一

时间:2011-10-03 18:21:42

标签: sql-server unique-key

我要求将varchar(500)列唯一 放置唯一约束不会起作用,因为它超过了唯一的大小限制 那么,什么是使列独特的最佳策略?

2 个答案:

答案 0 :(得分:4)

使用varchar(500)的HASH创建另一个字段,并在哈希字段上添加UNIQUE CONSTRAINTHASHBYTES('md5', MyLongVarcharField)

这会导致性能不佳,但是如果你有一个varchar(500),你需要强制执行唯一性,那么我认为性能不是你的考虑的最前沿。

修改

为了澄清,两个字符串输出相同的128位散列值的可能性是1 in 340,282,366,920,938,000,000,000,000,000,000,000,000

,这不太可能,但不是绝对不可能

如果您仍然担心,可以使用160位的SHASHA1算法。

答案 1 :(得分:0)

您可以在INSERT和UPDATE上使用DML触发器。这需要使用哈希。为简单起见,我选择了一个AFTER触发器,但这也可以通过INSTEAD OF触发器轻松完成。

create trigger dml_EnforceUniqueVal
on dbo.UniqueBigColumn
after insert, update
as  
    declare @CountOfRepeats int
    select @CountOfRepeats = COUNT(*)
    from UniqueBigColumn
    where somestring in
    (
        select somestring
        from inserted
    )

    if @CountOfRepeats > 1
        rollback
go