【问题标题】:SQL Server unique constraint problemSQL Server 唯一性约束问题
【发布时间】:2011-02-17 00:15:57
【问题描述】:

如何在视觉工作室中对 varchar(max) 字段创建唯一约束。

问题出在我尝试的时候:

管理索引和键 > 添加 > 列

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

我是否必须使用检查约束

如果是,表达式中的内容是什么?

谢谢你的信息

【问题讨论】:

    标签: sql sql-server visual-studio-2010 unique-constraint


    【解决方案1】:

    您不能在 VARCHAR(MAX) 列上设置唯一约束(最多可以是 2 GB 的文本!!)。你只是不能。

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

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

    【讨论】:

    • 是的,缩短它。根据email.about.com/od/emailbehindthescenes/f/address_length.htm,最大长度为 320 个字符
    • 天哪,EMAIL 字段?是的,缩短它。当有人给我看一个 2GB 长的电子邮件地址时,我会吃掉我的话
    • 我已经使用 Varchar(100) 大约 10 年了,但我从未见过任何一封电子邮件甚至接近它。
    • @b0x0rz:每个索引条目(构成一个索引条目的所有列的长度)不能超过 900 字节 - 对于每个索引,在任何表上。例如。您可以有两个 VARCHAR(200) 字段 - 但不能有两个 VARCHAR(500) 字段。
    • @b0x0rz 前面的段落推荐 32、256 或 4k - 我认为这对于完全未知数的一般规则来说很好。但通常情况下,我将在收集需求时获得更好的信息,并且一旦我知道它们,我将在数据库中强制执行这些长度。强制长度(像任何约束一样)将有助于更早地发现意外问题。更糟糕的是,发现您多年来一直收到大量无效电子邮件,或者发现某人的电子邮件地址太长,您需要对系统进行一些修改。
    【解决方案2】:

    执行此操作的一种方法是为哈希添加一列,该哈希在您插入或更新该列时计算,并在其上放置一个唯一索引。虽然确实会发生哈希冲突,但它不太可能发生。

    你可以使用这个 T-SQL 关键字:

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

    【讨论】:

      【解决方案3】:

      即使这是可能的,那也是个坏主意。

      1) 还有另一种方法。查找一些其他数据以用作您的唯一列

      2) 如果您绝对必须使用 varchar(Max)。也许在插入/更新时对其进行散列并添加一个散列列?

      【讨论】:

        猜你喜欢
        • 2013-10-18
        • 2019-05-13
        • 1970-01-01
        • 2013-01-01
        • 1970-01-01
        • 2014-10-01
        • 2013-11-01
        • 1970-01-01
        • 2022-01-05
        相关资源
        最近更新 更多