我创建了一个检查列的积极性的约束,我无法删除约束,或者确切地说,我甚至不清楚约束是否存在。尝试删除约束会给出错误消息:
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
约束,但是我创建了其他约束。
知道为什么会这样吗?任何帮助表示赞赏。
答案 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%'