2012-10-01 128 views
4

我试图用丢弃从表中的主键约束下SQL Server 2008中无法删除约束

ALTER TABLE SchemaName.LabourGrade DROP CONSTRAINT Labour_Grade_pk 

,并得到错误Labour_Grade_pk is not a constraint.

当我做

SELECT * FROM sysobjects WHERE name = 'LabourGrade_pk'

我得到一行。它确实有FK,所以我试着放弃那些第一但同样的问题。 我只想放弃PK以改变列的数据类型,有没有更好的方法来做到这一点?

+0

你是从哪里改变数据类型?你并不总是必须放弃PK。 –

+0

其当前varchar(2),它需要是varchar(3)。当我试图改变列时,我得到了一个关于对象LabourGrade_pk依赖于列代码的错误 – Nix

+3

其中一个名称有两个下划线,另一个有一个下划线。在你的问题,或实际问题的错字? –

回答

3

我只想放弃PK以改变列的数据类型,有没有更好的方法来做到这一点?

是的,你根本不需要删除并重新创建PK(和相关的索引)。您可以通过ALTER TABLE ... ALTER COLUMN将其作为简单的元数据更改来完成。

CREATE TABLE #T 
(
P VARCHAR(2) PRIMARY KEY 
)  

INSERT INTO #T VALUES ('AA') 

ALTER TABLE #T ALTER COLUMN P VARCHAR(3) NOT NULL 

DROP TABLE #T 
+0

我试着这样做,但得到一个关于PK的错误取决于列 – Nix

+0

@Nix - 请确保您指定了“NOT NULL”。否则,你会得到错误'The object'PK __#T________3BD019BD4CA06362'依赖于列'P'... ALTER TABLE ALTER COLUMN P失败,因为一个或多个对象访问该列。' –

+0

有几个FK关系引用该表的PK所以我试图首先改变它们,包括不为null,仍然让对象依赖于列错误。 – Nix

4

如果SELECT * FROM sysobjects WHERE name = 'LabourGrade_pk'返回一个排,那么你要使用:

ALTER TABLE SchemaName.LabourGrade DROP CONSTRAINT LabourGrade_pk 

ALTER TABLE SchemaName.LabourGrade DROP CONSTRAINT Labour_Grade_pk 
                 --^-- We don't want this 

但是,为什么你需要取消该约束这并没有解决,根据其他评论和@ Martin的回答。