gpt4 book ai didi

sql-server - 删除聚集索引会从列中删除 PK

转载 作者:行者123 更新时间:2023-12-01 08:18:10 25 4
gpt4 key购买 nike

如果我删除聚集索引(在 PK 列上设置),它会从列定义中删除 PK 属性。这是怎么回事?

如果我在表上有一个非聚集索引并且我删除了聚集索引,那么它不会从列定义中删除 PK 属性

最佳答案

我假设您是从 GUI 工具而不是从 SQL 语句执行此操作。
当您尝试删除已在 PK 上定义的聚集索引时实际发生的情况,它将首先执行 ALTER TABLE DROP CONSTRAINT,因为它将无法对 PK 正在使用的索引执行 DROP INDEX 语句(见 this MSDN article,第二段)。您也不应该使用非聚集索引来执行此操作。

这是一个例子......我创建了一个 Foo 表:

CREATE TABLE foo (id int primary key, value varchar(50))

这将创建一个自动聚集索引(即 PK_foo_3213EXXXXXXXXX)

尝试从工具(SQL 管理工作室)执行此操作:
右键单击该表中的 PK_foo_3213EXXXXXXXX 索引并执行 Script Index As -> DROP to... 看看它会生成什么...

其实是这样的:
/****** Object:  Index [PK__foo__3213E83F7F60ED59]    Script Date: 03/17/2011 11:49:57 ******/
IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[foo]') AND name = N'PK__foo__3213E83F7F60ED59')
ALTER TABLE [dbo].[foo] DROP CONSTRAINT [PK__foo__3213E83F7F60ED59]
GO

假设我向表中添加另一个索引(唯一的非聚集),如下所示:
/****** Object:  Index [test]    Script Date: 03/17/2011 11:55:46 ******/
CREATE UNIQUE NONCLUSTERED INDEX [test] ON [dbo].[foo]
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

并执行相同的操作(Script as DROP to),这是将生成的脚本:
/****** Object:  Index [test]    Script Date: 03/17/2011 11:54:48 ******/
IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[foo]') AND name = N'test')
DROP INDEX [test] ON [dbo].[foo] WITH ( ONLINE = OFF )
GO

USE [dummy]
GO

注意区别(前一个是ALTER TABLE DROP CONSTRAINT,后一个是DROP INDEX)。

如果您尝试强制 SQL 在 PK 聚集索引上执行此操作:
DROP INDEX [PK__foo__3213E83F7F60ED59] ON [dbo].[foo]

你会得到这个:

消息 3723,级别 16,状态 4,第 1 行
索引“dbo.foo.PK_foo_3213E83F7F60ED59”上不允许显式的 DROP INDEX。它用于 PRIMARY KEY 约束强制执行。


因此,SQL 被迫改为执行 DROP CONSTRAINT。

我不确定你的第二个 if 语句是什么意思......如果你的意思是你已经在非聚集索引上定义了一个 PK 并且你有另一个不是 PK 的聚集索引并删除该聚集索引......那么是...这就是将要发生的行为(您的 PK 约束不会被删除)。

为了好玩起见,尝试在非聚集索引上的 PK 上编写 DROP INDEX 脚本......并猜测它将生成什么脚本:)。提示 提示... ALTER TABLE .... DROP ... CONSTRAINT

关于sql-server - 删除聚集索引会从列中删除 PK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5343175/

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