1

我对 SQL Server 还很陌生,所以如果我说的任何话都没有道理,我很有可能只是被某些东西弄糊涂了。反正...

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

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

4

1 回答 1

1

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

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

(请注意,我提到的 HASHBYTES 函数本身最多只能散列 8000 字节。如果你想比这更大,你必须滚动你自己的散列函数或忍受由 CHECKSUM() 函数引起的冲突)

于 2012-10-31T12:00:31.540 回答