【问题标题】:SQL Server: drop table primary key, without knowing its nameSQL Server:删除表主键,不知道其名称
【发布时间】:2010-12-07 22:50:49
【问题描述】:

嗨,

使用:SQL Server 数据库:北风

我想删除一个表主键,但不知道 PK 约束名称..

例如,使用Northwind Sample数据库中的Categories表,主键列是'CategoryId',主键名称是'PK_Categories'

我可以在知道主键名称的情况下删除主键:

ALTER TABLE categories DROP CONSTRAINT PK_Categories;

而且我还可以通过表名获取表的主键名:

select name from sysobjects where xtype = 'PK' and parent_obj = object_id('categories')

但是,在不知道主键名称的情况下,我无法将它们放在一起删除表的主键。

我正在尝试:

ALTER TABLE categories DROP CONSTRAINT


(select name from sysobjects where xtype = 'PK' and parent_obj = object_id('categories') ) 

谁能告诉我哪里出错了?

非常感谢,

鲍勃

【问题讨论】:

  • 有人会认为,由于可以在不指定约束名称(自动生成)的情况下创建主键,因此也可以删除该主键而无需指定名称。

标签: sql sql-server primary-key


【解决方案1】:

您必须为此使用动态 SQL,因为 ALTER TABLE 不接受变量或子查询。

CREATE TABLE PKTest ( ID INT PRIMARY KEY ) ;

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

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

EXEC (@SQL)

DROP TABLE PKTest

【讨论】:

  • 太棒了!我试图看看没有动态sql是否可能......不用担心。谢谢!
【解决方案2】:

添加到 Stuart Ainsworth 的答案,我不知道 PK 名称是否必须在不同的模式中是唯一的(如果是,那么答案是可以的)。无论如何,我会为 PK 名称选择不同的子查询,允许明确定义架构:

declare @PrimaryKeyName sysname = 
    (select CONSTRAINT_NAME 
     from INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
     where CONSTRAINT_TYPE = 'PRIMARY KEY' and TABLE_SCHEMA='dbo' and TABLE_NAME = 'PKTest'
    )

IF @PrimaryKeyName is not null
begin
    declare @SQL_PK NVARCHAR(MAX) = 'alter table dbo.PKTest drop constraint ' + @PrimaryKeyName
    print (@SQL_PK)
    EXEC sp_executesql @SQL_PK;
end

【讨论】:

  • 这很好。我总是忘记考虑架构。 :)
猜你喜欢
  • 2010-10-14
  • 2010-11-28
  • 2023-03-10
  • 2021-01-05
  • 2013-08-06
  • 1970-01-01
  • 2014-01-11
  • 1970-01-01
  • 2010-11-23
相关资源
最近更新 更多