3

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

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

某处的文档是这样说的:

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

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

已尝试定义非聚集index IX和指定主键,还尝试了更改表的各种组合...添加约束...主键语句无济于事。

有意义的是,我的索引 IX 等效于 SQL Server 在我简单地指定更改表中的 ID 列时创建的非聚集索引 .... 添加约束 .... 主键 (ID) 语句,但我不希望拥有 SQL Server 为我创建的这个冗余索引,而是让它使用index IX它还包含一个列的包含列表。

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

如果可以更改 SQL Server 创建的索引,我的问题将得到解决,但我想对其进行的更改需要删除并重新创建。

4

1 回答 1

0

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

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

可以将唯一索引替换为唯一约束,因为元数据仅使用更改,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; 
于 2014-12-28T13:22:06.480 回答