使用SQL Server数据库中的脚本删除主键

mut*_*mar 43 sql-server sql-server-2005 sql-server-2008

我需要删除StudentSQL Server数据库中表的主键.

我已经在表格中编辑了,我得到的脚本是

ALTER TABLE dbo.Student
    DROP CONSTRAINT PK__Student__9CC368536561EF8B
Run Code Online (Sandbox Code Playgroud)

但是当我在SQL Server查询浏览器中运行此脚本以删除主键时

它显示了该消息

Msg 3728,Level 16,State 1,Line
1'PK__Student__9CC368536561EF8B'不是约束.
Msg 3727,Level 16,State 0,Line 1

令我担心的是,我认为PK__Student__9CC368536561EF8B这将随机生成,请帮助我使用脚本删除主键约束.

提前致谢

Bri*_*dge 80

您可以在sys.key_constraints表中查找约束名称:

SELECT name
FROM   sys.key_constraints
WHERE  [type] = 'PK'
       AND [parent_object_id] = Object_id('dbo.Student');
Run Code Online (Sandbox Code Playgroud)

如果你不关心这个名字,但只是想删除它,你可以使用这个和动态sql的组合:

DECLARE @table NVARCHAR(512), @sql NVARCHAR(MAX);

SELECT @table = N'dbo.Student';

SELECT @sql = 'ALTER TABLE ' + @table 
    + ' DROP CONSTRAINT ' + name + ';'
    FROM sys.key_constraints
    WHERE [type] = 'PK'
    AND [parent_object_id] = OBJECT_ID(@table);

EXEC sp_executeSQL @sql;
Run Code Online (Sandbox Code Playgroud)

此代码来自Aaron Bertrand(来源).

  • 只要没有其他表引用我们要删除的主键的表,这就会起作用。如果您有表引用它(通过外键),那么您还必须首先删除所有引用外键。 (2认同)

小智 13

只需点击

'数据库'>表>你的表名>键>复制像'PK__TableName__30242045'这样的约束

并运行以下查询是:

Query:alter Table 'TableName' drop constraint PK__TableName__30242045
Run Code Online (Sandbox Code Playgroud)

  • 我对您答案的格式进行了一些改进。您可以检查第一个操作字符串是否正确吗? (2认同)

mut*_*mar 5

我得到的答案是变量和子查询将不起作用,我们必须使用动态SQL脚本。以下作品:

DECLARE @SQL VARCHAR(4000)
SET @SQL = 'ALTER TABLE dbo.Student DROP CONSTRAINT |ConstraintName| '

SET @SQL = REPLACE(@SQL, '|ConstraintName|', ( SELECT   name
                                               FROM     sysobjects
                                               WHERE    xtype = 'PK'
                                                        AND parent_obj =        OBJECT_ID('Student')))

EXEC (@SQL)
Run Code Online (Sandbox Code Playgroud)