通过 alter table 命令删除 T-SQL 中的约束 - 问题

问题描述

我在 t-sql 中有以下代码

alter table Persons
drop primary key;

还有消息: 消息 156,级别 15,状态 1,第 10 行 关键字“primary”附近的语法不正确。

我检查了不同的语法组合,但都没有奏效。 这里有什么问题?

表格就是这样创建的 - 这只是学习的开始,非常简单,只有两个约束。

create table Persons(
PersonID int not null primary key,LastName varchar(255),FirstName varchar(255),Address varchar(255),City varchar(255)
);

解决方法

不是DROP PRIMARY KEY,而是DROP CONSTRAINT {Object Name}。例如:

CREATE TABLE dbo.YourTable (ID int NOT NULL);
GO
ALTER TABLE dbo.YourTable ADD CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED (ID);
GO
ALTER TABLE dbo.YourTable DROP CONSTRAINT PK_YourTable;
GO
DROP TABLE dbo.YourTable;

这就是为什么显式命名您的对象如此重要的原因,如上所示,因为您现在不知道 CONSTRAINT 的名称是什么。但是,您可以通过以下方式获取名称:

SELECT kc.[name]
FROM sys.key_constraints kc
     JOIN sys.tables t ON kc.parent_object_id = t.object_id
     JOIN sys.schemas s ON t.schema_id = t.schema_id
WHERE s.[name] = N'dbo'
  AND t.[name] = N'YourTable'
  AND kc.[type] = 'PK';

如果你真的不想找出名字然后写语句,你可以使用动态语句:

DECLARE @SQL nvarchar(MAX);
SET @SQL = (SELECT N'ALTER TABLE ' + QUOTENAME(s.[name]) + N'.' + QUOTENAME(t.[name]) + N' DROP CONSTRAINT ' + QUOTENAME(kc.[name]) + N';'
            FROM sys.key_constraints kc
                 JOIN sys.tables t ON kc.parent_object_id = t.object_id
                 JOIN sys.schemas s ON t.schema_id = t.schema_id
            WHERE s.[name] = N'dbo'
              AND t.[name] = N'YourTable'
              AND kc.[type] = 'PK');
EXEC sys.sp_executesql @SQL;