有没有办法在大于900字节的列上创建唯一约束?

时间:2012-10-30 20:58:45

标签: sql-server indexing primary-key

我是SQL Server的新手,所以如果我说的话没有意义,那么我很有可能会被某些东西搞糊涂。总之...

我有一个简单的映射表。它有两列BeforeAfter。我想要的只是Before列唯一的约束。最初它被设置为主键,但是当值太大时会产生错误。我尝试添加ID列作为主键,然后将UNIQUE添加到Before列,但我遇到的问题是最大长度超过900个字节(我猜这个约束会创建索引)。

我能想到的唯一选择是将id列更改为校验和列并将其作为主键,但我不喜欢此选项。有没有不同的方法来做到这一点?我只需要两个简单的列。

1 个答案:

答案 0 :(得分:1)

我能想到保证数据库内部唯一性的唯一方法是使用INSTEAD OF触发器。我提供给MSDN的链接有一个用于检查唯一性的示例。这个解决方案很可能确实非常慢,因为您将无法对正在检查的列进行索引。

您可以通过使用计算列来创建哈希(可能使用Before列的HASHBYTES function)来加快速度。然后,您可以在该哈希列上创建一个非唯一索引,并在触发器内检查否定大小写 - 也就是说,检查具有相同哈希的行是否不存在。如果发生这种情况,请退出触发器。如果存在具有相同散列的另一行,则可以对更精确的副本执行更昂贵的检查,并在用户输入重复值时引发错误。您也可以通过简单地在一个EXISTS()子句中比较哈希值和Before值来简化检查,但我还没有使用该解决方案的性能。

(请注意,我自己提到的HASHBYTES函数最多只能散列8000个字节。如果你想要更大,那么你必须滚动自己的散列函数或者接受由CHECKSUM引起的碰撞( )功能)