SQL Server唯一约束问题

19

如何在Visual Studio中可视化地创建一个varchar(max)字段的唯一约束。

问题是当我尝试时:

管理索引和键 > 添加 > 列

我只能选择bigint列,而不能选择任何varchar(max)列。

我可能需要使用检查约束吗?

如果是,表达式里该写什么呢?

感谢提供信息。

3个回答

21

在一个 VARCHAR(MAX) 列上(可能高达2GB文本!!),您不能设置唯一约束。这是根本不可能的。

唯一约束由后台的唯一索引强制执行,而SQL Server对索引条目有900字节的限制。出于同样的原因,您也不能在 VARCHAR(2000) 字段上设置唯一约束。

您需要找到另一种方法来实现您想要做的事情。例如,您可以计算文本的长度和校验和,并在这些长度和校验和列上设置唯一约束。


4
好的,我将为您进行翻译。根据http://email.about.com/od/emailbehindthescenes/f/address_length.htm,最大长度为320个字符,请缩短它。 - Martin Smith
13
天啊,邮件字段?是的,请缩短它。如果有人给我展示一个2GB长的电子邮件地址,那我就吃掉我的话。 - Neil N
2
我现在已经使用Varchar(100)约10年了,但我从未见过任何接近这个长度的电子邮件。 - Neil N
2
@b0x0rz:每个索引条目(组成一个索引条目的所有列的长度)不能超过900字节 - 对于任何表上的每个索引。例如,您可以有两个VARCHAR(200)字段 - 但不能有两个VARCHAR(500)字段。 - marc_s
2
@b0x0rz 在此之前的段落建议使用32、256或4k - 我认为这对于完全不知道情况的人来说是可以的。但通常情况下,在我的需求收集中,我会获得更好的信息,并在了解它们后在数据库中强制执行长度。强制长度(就像任何约束条件一样)有助于更早地捕获意外问题。什么更糟糕,发现你已经收到了巨大且无效的电子邮件多年,还是发现有人的电子邮件地址太长,需要稍微修改系统。 - Cade Roux
显示剩余10条评论

2

一种方法是在插入或更新列时计算哈希值并添加一个用于哈希的列,并在其上放置唯一索引。虽然哈希冲突确实会发生,但这是极不可能的。

您可以使用此T-SQL关键字:

http://msdn.microsoft.com/en-us/library/ms174415.aspx


1
即使这是可能的,这也是一个不好的想法。
1)还有另一种方法。找到其他数据作为您的唯一列使用。
2)如果您绝对必须使用varchar(Max),那么在插入/更新时对其进行哈希处理并添加哈希列如何?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接