索引视图的两列上的唯一聚集索引

Posted

技术标签:

【中文标题】索引视图的两列上的唯一聚集索引【英文标题】:Unique clustered index on two columns for an indexed view 【发布时间】:2012-06-04 20:54:27 【问题描述】:

我正在尝试在没有唯一 ID 的表上设置索引视图。它有两个唯一的标识符,如果组合起来对于它的行来说是唯一的。我在创建索引视图所需的唯一聚集索引时遇到了麻烦,因为我在 MSDN 上找到了一个线程,人们都同意可以从 2 列中为索引视图创建唯一聚集索引@http://social.msdn.microsoft.com/Forums/en/transactsql/thread/f2c99845-3af1-46e8-9b52-363c24988744

但是对于我的生活,无法弄清楚如何创建它。我正在处理这个查询,但它似乎没有削减它。

CREATE UNIQUE CLUSTERED INDEX  [PK] ON MyView
(
MyId1, MyId2
)

错误:

CREATE UNIQUE INDEX 语句因重复键而终止 为对象名称“dbo.MyView”和索引名称“PK”找到。 重复键值为 (71cd9b68-1a9e-47bc-bc6b-0008b230a6d8, 0e64aa3a-0631-4caf-82d9-73609ee79b19)。

列为重复的两个 ID 是来自 MyId2 的 ID。

那么,我怎样才能在这里创建一个唯一的聚集索引呢?

【问题讨论】:

不只是在该列上重复,是MyId1MyId2 的组合是重复的 运行“通过 MyId1 从 MyView 组中选择 MyId1、MyId2,MyId2 的 count(*) > 1”。这将向您显示您的重复项,因为您可能拥有的不仅仅是显示的组合。 SQL 在遇到其预期跨 MyId1、MyId2 的唯一性异常时出错。 为什么不直接在表上创建索引呢?为什么需要视图? 啊啊啊是的,那些是怎么到那里的?!谢谢大家,整理了一下,瞧,得到了我的索引视图! 【参考方案1】:

嗯,错误消息似乎表明存在多个记录,其中 MyId1 = 71cd9b68-1a9e-47bc-bc6b-0008b230a6d8MyId2 = 0e64aa3a-0631-4caf-82d9-73609ee79b19

我建议运行一个仅基于该条件进行选择的查询,并确认它只返回一条记录。如果它返回更多,那么除非您消除重复项,否则您无法在这两列上重新创建 UNIQUE 约束。

【讨论】:

以上是关于索引视图的两列上的唯一聚集索引的主要内容,如果未能解决你的问题,请参考以下文章

怎么取消自增列上的聚集索引

非聚集索引 - 几乎相同需求的一个或两个索引(两个表之间的连接)?

我应该摆脱 Guid 列上的聚集索引吗

名词解释与区分聚集索引非聚集索引主键索引唯一索引普通索引前缀索引单列索引组合索引全文索引覆盖索引

名词解释与区分聚集索引非聚集索引主键索引唯一索引普通索引前缀索引单列索引组合索引全文索引覆盖索引

堆上的非聚集索引与聚集索引的性能 [关闭]