当用户激活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'不存在或者您没有删除它的权限。
如果SQL Server删除了约束,索引是否也会被删除?
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'