2016-03-15 116 views
-1

当我打开SSMS中的表的设计器时,第一列Id将为其分配一个主键(IDENTITY),并在其旁边显示键图标。在Indexes/Keys窗口中,我可以看到名称为[PK_dbo.Lines]Primary KeyPK_dbo.Lines条目。无法删除SQL Server中的主键约束

ALTER TABLE dbo.Lines DROP CONSTRAINT [PK_dbo.Lines] 

回报

消息3728,级别16,状态1,第33行
'PK_dbo.Lines' 不是一个约束。

如果我执行

SELECT * 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 

我可以看到主键的所有表,除了表Lines ...

该查询也不会返回任何结果:

select object_name (parent_obj) ObjectName, name 
from sysobjects 
where xtype = 'PK' 
    and parent_obj = (object_id('[dbo].[Lines]')) 

有什么想法这里发生了什么?

+1

如果您对数据库中的表/列进行任何更改SSMS需要手动**刷新以正确反映这些更改。难道它就像右键单击'Tables'并选择刷新一样简单? – Ralph

+1

我试图模拟你的情况,一切正常。请提供您的表格完整脚本。 – FLICKER

+0

@Ralph你是对的,但它似乎不仅需要刷新,而且关闭设计器窗口,然后重新打开它。看起来,无论何时显示窗口索引/键,它都会在设计器加载时显示数据,并且在设计器关闭并重新打开之前它不会刷新数据。发布您的建议作为答案,我会接受它。 – Goran

回答

0

如果您对数据库中的表/列进行了任何更改SSMS需要手动刷新以正确反映这些更改。难道它就像右键单击表格并选择刷新一样简单?

或者,您可能拼错了PK名称?请尝试以下脚本从表中“行”删除PK:

declare @PK_Name nvarchar(200); 
declare @strSQL nvarchar(max); 

select @PK_Name = (
        select i.name as IndexName 
        from sys.indexes as i 
        inner join sys.index_columns as ic 
        on  i.object_id = ic.object_id 
          and i.index_id = ic.index_id 
        inner join sys.tables as t 
        on  t.object_id = i.object_id 
        where i.is_primary_key = 1 
          and t.name = N'Lines' 
        ) 

set @strSQL = N'ALTER TABLE dbo.Lines DROP CONSTRAINT ' + @PK_Name 

execute(@strSQL) 

首先是脚本的PK检索正确的名称,然后它会尝试删除PK约束。

+0

对于处于同一情况的任何人,不要忘记关闭并重新打开桌子设计师! – Goran