无法在SQL Server中删除索引



当用户激活FK索引删除选项时,为其生成DDL,当激活PK索引删除选项时,为该应用程序创建DDL。

用下面的例子创建了两个表。

CREATE TABLE [dbo].[TABLE3] 
(
[COL] [VARCHAR](20) NOT NULL
)
GO
ALTER TABLE [dbo].[TABLE3]
ADD CONSTRAINT [PK_TABLE3]
PRIMARY KEY NONCLUSTERED ([COL] ASC)
GO
CREATE TABLE [dbo].[TABLE4] 
(
[COL] [VARCHAR](20)
)
GO
ALTER TABLE [dbo].[TABLE4]
ADD CONSTRAINT [FK_TABLE3_TO_TABLE4]
FOREIGN KEY ([COL]) REFERENCES [dbo].[TABLE3] ([COL])
ON DELETE NO ACTION
ON UPDATE NO ACTION
GO

如果同时选择了Delete FK Constraints选项和Delete FK Index选项生成以下语法:

ALTER TABLE [dbo].[TABLE4]
DROP CONSTRAINT IF EXISTS [FK_TABLE3_TO_TABLE4]
GO
ALTER TABLE [dbo].[TABLE3]
DROP CONSTRAINT IF EXISTS [PK_TABLE3]
GO
DROP INDEX [dbo].[TABLE3].[PK_TABLE3]
GO

DROP INDEX语法错误。

SQL Error [3701] [S0007]: Index 'dbo.TABLE3。PK_TABLE3'不存在或者您没有删除它的权限。

我的问题是:
  1. 如果SQL Server删除了约束,索引是否也会被删除?

  2. DROP INDEX语句可以使用IF EXISTS来防止错误,但我知道IF EXISTS是由SQL Server 2014或2016支持的。

由于正在开发的应用程序的2005版本需要支持,IF EXISTS语法似乎不是一个明确的解决方案。

请告诉我该怎么办。

每个版本的SQL Server文档,请参考以下链接。

SQL Server 2005: https://learn.microsoft.com/en-us/previous-versions/sql/sql-server-2005/ms176118(v=sql.90)

SQL Server 2008: https://learn.microsoft.com/en-us/previous-versions/sql/sql-server-2008/ms176118(v=sql.100)

SQL Server 2012: https://learn.microsoft.com/en-us/previous-versions/sql/sql-server-2012/ms176118(v=sql.110)

试试下面的代码:

ALTER TABLE dbo.TABLE4 DROP CONSTRAINT FK_TABLE3_TO_TABLE4
GO
ALTER TABLE dbo.TABLE3 DROP CONSTRAINT PK_TABLE3
Go

您可以使用以下代码来获取数据库中的约束名称列表:

SELECT TABLE_NAME,
CONSTRAINT_TYPE,CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS

SELECT TABLE_NAME,
CONSTRAINT_TYPE,CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE LOWER(TABLE_NAME) <> N'sysdiagrams'
CONSTRAINT_NAMEPK_TABLE3外键FK_TABLE3_TO_TABLE4

最新更新