【发布时间】:2014-08-08 21:52:18
【问题描述】:
我有一个堆表 - 没有定义聚集索引 - (称为 table A),在不可为空的列上有一个唯一的非聚集索引(称为 column ID 和 index IX)。
在为table A 定义column ID 的主键约束时,我想使用index IX。
某处的文档是这样说的:
数据库引擎自动创建唯一索引以强制执行 PRIMARY KEY 约束的唯一性要求。如果聚集索引确实 表上尚不存在或未显式指定非聚集索引,则创建唯一的聚集索引以强制执行 PRIMARY KEY 约束。
我已经阅读了整个 ALTER TABLE 文档,但似乎没有“非聚集索引是……明确指定的”的语法。
已尝试定义非聚集index IX并指定主键,也尝试了alter table的各种组合...添加约束...主键语句无济于事。
当我在 alter table 中指定 ID 列时,我的索引 IX 等同于 SQL Server 创建的非聚集索引 .... 添加约束 .... 主键 (ID) 语句,这是有道理的,但我宁愿没有 SQL Server 为我创建的冗余索引,而是让它使用index IX,它也包含列的包含列表。
如果我删除 SQL Server 创建的索引,那么主键约束也会消失。
如果可以更改 SQL Server 创建的索引,我的问题将得到解决,但我想对其进行的更改需要删除并重新创建。
【问题讨论】:
-
为什么不保持原样?具有
NOT NULL和UNIQUE约束的列等效于具有PRIMARY KEY约束的列。为什么还要改呢? -
文档不清楚。我认为这意味着根据语句创建聚集索引或非聚集索引。并不是说您可以指定以前存在的索引。因此,在定义
PRIMARY KEY约束时,您无法避免创建新索引。 -
我猜他们指的是主键声明中
PRIMARY KEY后面的可选[ CLUSTERED | NONCLUSTERED ]部分(这可能也是@ypercube 所说的)。语法图显示无法指定现有索引与主键约束一起使用,您只能指定 [新] 主键索引是集群还是非集群。 -
不能让表保持原样 - 需要一个主键才能在其他表上具有外键约束,引用有问题的表。也可以不只是让 sql server 做这件事并创建索引,因为自动创建的索引并不完全是需要的 - 例如,希望在索引上有一些包含列。现在,我只满足于创建冗余索引。这并不理想,因为在 DML 语句期间要多维护一个索引,还要再多一个索引来混淆查询优化器 :-),并浪费更多内存。
-
是的 Andriy M ,我同意,他们可能确实提到了指定非集群索引的能力 - 与指定实际的现有索引一样:-) 但 imo,他们应该改写。不过还是谢谢。
标签: sql-server-2012 primary-key non-clustered-index