在定义主键约束时指定现有的非群集唯一索引

时间:2014-06-18 14:31:36

标签: sql-server-2012 primary-key non-clustered-index

我有一个堆表 - 没有定义聚簇索引 - (称之为table A),在非可空列上使用唯一的非聚集索引(调用column IDindex IX )。

我想在index IX column ID上定义主键约束时使用table A

某处的文件说明了这一点:

  

数据库引擎自动创建唯一索引以强制执行PRIMARY KEY约束的唯一性要求。如果是聚簇索引   如果表中尚未存在或未显式指定非聚簇索引,则会创建唯一的聚簇索引以强制执行PRIMARY KEY约束。

我已经阅读了整个ALTER TABLE文档,但似乎没有#34的语法;非聚集索引是......明确指定的,"。

尝试定义非聚集index IX并指定主键,并尝试了各种alter table组合...添加约束...主键语句无效。

有意义的是,当我只在alter table中指定ID列时,我的索引IX等同于SQL Server创建的非聚簇索引....添加约束....主键(ID)语句,但是我不希望SQL Server为我创建这个冗余索引,而是让它使用index IX,它也包含列的列表。

如果删除SQL Server创建的索引,则主键约束也会消失。

如果有可能改变SQL Server创建的索引,我的问题就会得到解决,但我想做的改动需要删除并重新创建。

1 个答案:

答案 0 :(得分:0)

无法创建约束并将其与已保证约束的现有索引相关联。

此功能确实存在于其他RDBMS中。对于超类型/子类型模式尤其有用,因为这需要在Id(Id, Type)上创建唯一索引,即使后者(FK所需)在第一个逻辑上得到保证。

可以使用唯一约束替换Unique索引作为仅使用ALTER TABLE ... SWITCH的元数据更改,但尝试使用非聚簇PK约束执行相同操作会失败

  

ALTER TABLE SWITCH语句失败。没有相同的索引   源表'A'表示目标表'B'中的索引'IX'。

为唯一约束执行此操作的代码是

初始位置

CREATE TABLE dbo.A(ID INT NOT NULL, OtherCols VARCHAR(200));

CREATE UNIQUE NONCLUSTERED INDEX IX ON dbo.A(ID);

INSERT INTO dbo.A VALUES (1,'A'),(2,'B');

用唯一约束替换唯一索引

SET XACT_ABORT ON;

BEGIN TRAN;

CREATE TABLE dbo.B
  (
     ID        INT NOT NULL CONSTRAINT IX UNIQUE NONCLUSTERED,
     OtherCols VARCHAR(200)
  );

ALTER TABLE dbo.A 
      SWITCH TO dbo.B;

DROP TABLE dbo.A;

EXECUTE sp_rename
  N'dbo.B',
  N'A',
  'OBJECT';

COMMIT;