我有一个堆表 - 没有定义聚簇索引 - (称之为table A
),在非可空列上使用唯一的非聚集索引(调用column ID
和index 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创建的索引,我的问题就会得到解决,但我想做的改动需要删除并重新创建。
答案 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;