gpt4 book ai didi

sql-server-2012 - 定义主键约束时指定现有的非聚集唯一索引

转载 作者:行者123 更新时间:2023-12-02 04:54:34 30 4
gpt4 key购买 nike

我有一个堆表 - 未定义聚簇索引 -(称其为 表 A),在不可为 null 的列上有一个唯一的非聚簇索引(称为 列 IDindex IX)。

table Acolumn ID 上定义主键约束时,我想使用 index IX

某处的文档是这样说的:

The Database Engine automatically creates a unique index to enforce the uniqueness requirement of the PRIMARY KEY constraint. If a clustered index does not already exist on the table or a nonclustered index is not explicitly specified, a unique, clustered index is created to enforce the PRIMARY KEY constraint.

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

已尝试定义非聚集的index IX 并指定主键,也尝试过各种组合的 alter table ... add constraint ... primary key 语句无济于事。

当我在 alter table 中简单地指定 ID 列时,我的索引 IX 等效于 SQL Server 创建的非聚集索引是有道理的....添加约束....主键 (ID) 语句,但我我宁愿没有 SQL Server 为我创建的这个冗余索引,而是让它使用 index IX,它也包含一个列的包含列表。

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

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

最佳答案

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

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

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

ALTER TABLE SWITCH statement failed. There is no identical index in source table 'A' for the index 'IX' in target table 'B'.

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

初始位置

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;

关于sql-server-2012 - 定义主键约束时指定现有的非聚集唯一索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24288300/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com