【问题标题】:Is there a way to create a unique constraint on a column larger than 900 bytes?有没有办法在大于 900 字节的列上创建唯一约束?
【发布时间】:2012-10-30 20:58:44
【问题描述】:

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

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

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

【问题讨论】:

  • 什么关系型数据库?什么是列数据类型?他们需要那么宽吗?
  • 当您说“校验和”时,您是在谈论哈希吗?
  • 我正在使用 Microsoft SQL 服务器。它们都是 nvarchar,是的,它们需要那么宽。是的哈希。将列校验和到它自己的列中。检查它的唯一性。
  • 不,SQL Server 没有办法做到这一点。 UNIQUE 约束始终通过唯一索引强制执行,并且最大值。任何索引条目的大小都是 900 字节 - 这是一个硬性的系统范围限制 - 您无法更改/配置它。

标签: sql-server indexing primary-key


【解决方案1】:

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

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

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

【讨论】:

  • 哈希值不能超过索引的900字节限制吗?
  • 不,哈希函数的目的是产生一个小的、固定长度的(通常使用 HASHBYTES,它是 128 位)数字。
  • 太棒了。我正在测试并且得到了我最初预期的小值,但是 HASHBYTES 链接说它最多返回 8000 个字节,这让我失望了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多