错误3728:不是约束

时间:2014-10-20 00:47:03

标签: sql sql-server database sql-server-2008

我正在尝试更改(不是最佳做法?)由一个软件安装的SQL Server数据库表。

目标:
将列上的约束设置为主键,然后将其删除。

备注:
APPT - 表名
ApptId - 用作主键的列(但未被软件设置为主键)

问题:
如何解决___ is not a constraint.错误消息?


我正在尝试运行(测试)的命令如下,并应启用和禁用ApptId行作为主键:

-- Set an existing field as the primary key
ALTER TABLE APPT
ADD PRIMARY KEY (ApptID)

-- Remove primary key constraint
ALTER TABLE APPT
DROP CONSTRAINT ApptID

以上命令将ApptID设置为主键,但是当它尝试删除时会产生错误消息

-- Error 3728: 'ApptID' is not a constraint.
-- Could not drop constraint. See previous errors.

为什么会这样?
当我尝试使用以下方法查看该表的约束时:

-- List all constraints for a specific table
SELECT OBJECT_NAME(OBJECT_ID) AS NameofConstraint,
OBJECT_NAME(parent_object_id) AS TableName,
type_desc AS ConstraintType
FROM sys.objects
WHERE type_desc LIKE '%CONSTRAINT' AND parent_object_id = OBJECT_ID('APPT')

我明白了:

NameofConstraint           | TableName | ConstraintType
PK__APPT__EDACF695230515B9 | APPT      | PRIMARY_KEY_CONSTRAINT 

当我通过Sql Management Studio将ApptId列设置为主键时,结果看起来更干净(即没有随机字符串)

NameofConstraint           | TableName | ConstraintType
PK_APPT                    | APPT      | PRIMARY_KEY_CONSTRAINT 

但是,当尝试以编程方式删除ApptId字段上的主键约束时,这无法解决我的问题。

2 个答案:

答案 0 :(得分:1)

您是否尝试过使用约束名称?

ALTER TABLE APPT DROP CONSTRAINT PK_APPT;

答案 1 :(得分:1)

当您添加没有名称的主键时,SQL Server会为约束生成名称

所以你看到的名字是PK__APPT__EDACF695230515B9

在这种情况下,您需要使用生成的名称来删除约束

ALTER TABLE APPT DROP CONSTRAINT PK__APPT__EDACF695230515B9

当您从SSMS添加主键时,它将名称命名为PK_APPT

你可以做同样的事情

ALTER TABLE APPT
ADD CONSTRAINT PK_APPT PRIMARY KEY (ApptID)