微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决通过 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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。