我要求将varchar(500)列唯一 放置唯一约束不会起作用,因为它超过了唯一的大小限制 那么,什么是使列独特的最佳策略?
答案 0 :(得分:4)
使用varchar(500)
的HASH创建另一个字段,并在哈希字段上添加UNIQUE CONSTRAINT
:HASHBYTES('md5', MyLongVarcharField)
这会导致性能不佳,但是如果你有一个varchar(500)
,你需要强制执行唯一性,那么我认为性能不是你的考虑的最前沿。
修改强>
为了澄清,两个字符串输出相同的128位散列值的可能性是1 in 340,282,366,920,938,000,000,000,000,000,000,000,000
。
如果您仍然担心,可以使用160位的SHA
或SHA1
算法。
答案 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