【问题标题】:Unable to drop constraint - SQL Server 2008 R2无法删除约束 - SQL Server 2008 R2
【发布时间】:2016-11-21 01:44:18
【问题描述】:

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

ALTER TABLE dbo.Test
DROP CONSTRAINT chk_positive;

消息 3728,第 16 级,状态 1,第 1 行 'chk_positive' 不是约束。 消息 3727,第 16 级,状态 0,第 1 行 无法删除约束。查看以前的错误

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

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

消息 547,第 16 级,状态 0,第 1 行 ALTER TABLE 语句与 CHECK 约束“chk_positive”冲突。冲突发生在数据库“...”、表“dbo.Test”、列“n_example”中。

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

知道为什么会发生这种情况吗?任何帮助表示赞赏。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      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’
      

      【讨论】:

        【解决方案3】:

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

         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%'
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-05
          • 2014-06-24
          • 1970-01-01
          • 2012-04-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多