我正在尝试更改(不是最佳做法?)由一个软件安装的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
字段上的主键约束时,这无法解决我的问题。
答案 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)