3

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

4

2 回答 2

4

使用 that 的 HASH 创建另一个字段varchar(500),并将 aUNIQUE CONSTRAINT放在哈希字段上:HASHBYTES('md5', MyLongVarcharField)

这将导致性能不佳,但如果您有varchar(500)需要强制执行唯一性的地方,我假设性能无论如何都不是您考虑的首要因素。

编辑:

澄清一下,两个字符串输出相同的 128 位哈希值的机会是1 in 340,282,366,920,938,000,000,000,000,000,000,000,000. 发生碰撞的可能性不大,但并非绝对不可能。

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

于 2011-10-03T18:28:31.703 回答
1

You can use a DML trigger on INSERT and UPDATE. This gets around having to use a hash. I chose an AFTER trigger for simplicity, but this can be easily done with an INSTEAD OF trigger as well.

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
于 2011-10-03T22:03:03.513 回答