SQL Server 2008无法删除约束。

4

我正试图使用以下语句从表中删除主键约束:

ALTER TABLE SchemaName.LabourGrade DROP CONSTRAINT Labour_Grade_pk

当我执行SELECT * FROM sysobjects WHERE name = 'LabourGrade_pk'时,出现了错误提示Labour_Grade_pk is not a constraint.

我得到了一行记录,它有外键,所以我先尝试删除这些外键,但问题仍然存在。我只想删除主键以更改列的数据类型,有更好的方法吗?


你要将数据类型从什么改为什么?你不一定需要删除主键。 - Martin Smith
目前它是varchar(2),需要更改为varchar(3)。当我尝试更改列时,出现了有关对象LabourGrade_pk依赖于列代码的错误。 - Nix
3
其中一个名称有两个下划线,另一个名称只有一个。你的问题中是否存在打字错误,还是实际出现了问题? - Damien_The_Unbeliever
你尝试过这个吗:ALTER TABLE LabourGrade ALTER COLUMN id_column_name varchar(3);? - Martin Wilson
1
@Nix - 你应该能够在不删除主键的情况下完成这个操作。确保在ALTER COLUMN中指定NOT NULL,否则它将失败,因为默认设置为将其设置为NULL。 - Martin Smith
谢谢Damian,就是这个问题。真不敢相信我没看到它... - Nix
2个回答

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的答案。

3
我只想删除主键以更改列的数据类型,有更好的方法吗?
是的,你不需要完全删除并重新创建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

我尝试这样做,但是出现了关于主键依赖于该列的错误。 - Nix
@Nix - 确保你指定了 NOT NULL。否则你会得到错误信息 The object 'PK__#T________3BD019BD4CA06362' is dependent on column 'P' ... ALTER TABLE ALTER COLUMN P failed because one or more objects access this column.(对象“PK__#T________3BD019BD4CA06362”依赖于列“P”...修改表格修改列“P”失败,因为有一个或多个对象访问此列。) - Martin Smith
有几个外键关系引用了该表的主键,因此我首先尝试修改它们,包括非空约束,但仍然出现“对象依赖于列”的错误。 - Nix
@Nix - 先删除外键约束,然后修改列的数据类型(在所有受影响的表中),然后再添加回外键约束。仍然不需要删除主键本身。 - Martin Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接