无法删除约束 - SQL Server 2008 R2

时间:2016-11-21 01:44:19

标签: sql sql-server

我创建了一个检查列的积极性的约束,我无法删除约束,或者确切地说,我甚至不清楚约束是否存在。尝试删除约束会给出错误消息:

ALTER TABLE dbo.Test
DROP CONSTRAINT chk_positive;

Msg 3728,Level 16,State 1,Line 1 'chk_positive'不是约束。 Msg 3727,Level 16,State 0,Line 1 无法删除约束。查看以前的错误

但是,然后尝试并尝试重新添加约束表明它已经存在

ALTER TABLE dbo.Test
ADD CONSTRAINT chk_positive CHECK (n_example > 0);

Msg 547,Level 16,State 0,Line 1 ALTER TABLE语句与CHECK约束“chk_positive”冲突。冲突发生在数据库“...”,表“dbo.Test”,列'n_example'。

查看SELECT * FROM sys.check_constraints的结果,没有提到chk_positive约束,但是我创建了其他约束。

知道为什么会这样吗?任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:2)

在SQL Server中,约束名称的名称空间是整个架构,而不仅仅是表格。

换句话说,两个表不能具有相同的约束名称。一般来说,当我命名约束时,我会包含表名(在您的情况下,chk_test_positive更可能是名称)。

您可以使用information_schema.table_constraints查看约束列表。应该有一个chk_positive在另一个表上定义。

我的建议:在约束名称中包含表名。

答案 1 :(得分:0)

尝试显示每个约束。我的猜测是大写问题,请尝试使用[]

SELECT OBJECT_NAME(object_id) AS ConstraintName,
       SCHEMA_NAME(schema_id) AS SchemaName,
       OBJECT_NAME(parent_object_id) AS TableName,
       type_desc AS ConstraintType
FROM sys.objects
WHERE type_desc LIKE ‘%CONSTRAINT’

答案 2 :(得分:0)

请在您正在使用的数据库下运行以下查询。您将获得已创建的检查约束(如果存在)和相应的表名称。正如其他人猜测的那样,您创建的检查约束可能是在其他表上错误地创建的。然后你可以相应地继续。

 select 
        cc.name
        ,cc.object_id
        ,SysObj.name "TableName"
        ,cc.parent_object_id 
FROM sys.check_constraints cc
INNER JOIN sys.objects SysObj 
            on cc.parent_object_id=SysObj.object_id
WHERE LOWER(cc.name) LIKE '%positive%'