【问题标题】:SQL Server unique index allowing duplicatesSQL Server 唯一索引允许重复
【发布时间】:2009-12-28 22:06:41
【问题描述】:

我使用的是 SQL Server 2008,有一个以 id(数字)列作为主键的表。在三个 varchar 列上也有一个唯一索引。我能够添加具有完全相同的三列集合的行。我通过对值的简单查询进行了验证,并返回了 2 行。

我编辑了索引并添加了 id 列。当我尝试再次编辑它并删除它抱怨有重复行的 id 列时,它删除了索引但无法创建它。

然后我清理重复的数据库,使用与唯一和非聚集相同的 3 个 varchar 重新创建索引,现在它可以正常工作,不允许重复。

有谁知道为什么这个索引的唯一性被忽略了?

【问题讨论】:

  • 索引没有被禁用,值完全一样:atsolberg.com/dupPaos.JPG 这是一张显示索引属性和查询+返回的两行结果的图片。我还在选择中添加了 len(*),以确保 varchars 值的长度相同。此外,这些行不是在索引存在之前添加的旧行,它们只是被添加。

标签: sql-server unique-index


【解决方案1】:

索引可能已被禁用(请参阅Disabling Indexes),您的“重复”值可能不同(例如尾随空格),或者您的测试可能不正确。

确定您没有在强制唯一索引中插入重复项。

【讨论】:

  • 索引没有被禁用,并且值完全相同:atsolberg.com/dupPaos.JPG 这是显示索引属性和查询+返回的两行结果的图片。我还在选择中添加了 len(***),以确保 varchars 值的长度相同。此外,这些行不是在索引存在之前添加的旧行,它们只是被添加。
  • 复制脚本,我相信你。
  • SI 对于查看 SET ANSI PADDING 设置和 SELECT WHERE 子句匹配值的排序规则也很重要。
  • SELECT COUNT(*), PAOClass, Category, PAOName FROM YukonPAOObject HAVING COUNT(*)>1 GROUP BY PAOClass, Catgory, PAOName。这会返回任何行吗?
【解决方案2】:

我不是这个主题的专家,但索引的“唯一”设置可能是指索引的构建/存储方式,而不是限制。这可能也意味着索引的性能是次优的。 创建索引时,DBMS 可能会检查这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多