我是SQL Server的新手,所以如果我说的话没有意义,那么我很有可能会被某些东西搞糊涂。总之...
我有一个简单的映射表。它有两列Before
和After
。我想要的只是Before
列唯一的约束。最初它被设置为主键,但是当值太大时会产生错误。我尝试添加ID
列作为主键,然后将UNIQUE
添加到Before
列,但我遇到的问题是最大长度超过900个字节(我猜这个约束会创建索引)。
我能想到的唯一选择是将id
列更改为校验和列并将其作为主键,但我不喜欢此选项。有没有不同的方法来做到这一点?我只需要两个简单的列。
答案 0 :(得分:1)
我能想到保证数据库内部唯一性的唯一方法是使用INSTEAD OF触发器。我提供给MSDN的链接有一个用于检查唯一性的示例。这个解决方案很可能确实非常慢,因为您将无法对正在检查的列进行索引。
您可以通过使用计算列来创建哈希(可能使用Before列的HASHBYTES function)来加快速度。然后,您可以在该哈希列上创建一个非唯一索引,并在触发器内检查否定大小写 - 也就是说,检查具有相同哈希的行是否不存在。如果发生这种情况,请退出触发器。如果存在具有相同散列的另一行,则可以对更精确的副本执行更昂贵的检查,并在用户输入重复值时引发错误。您也可以通过简单地在一个EXISTS()子句中比较哈希值和Before值来简化检查,但我还没有使用该解决方案的性能。
(请注意,我自己提到的HASHBYTES函数最多只能散列8000个字节。如果你想要更大,那么你必须滚动自己的散列函数或者接受由CHECKSUM引起的碰撞( )功能)