【问题标题】:ERROR Column CHECK constraint for column references another column列引用另一列的 ERROR Column CHECK 约束
【发布时间】:2019-09-11 00:03:07
【问题描述】:

我使用 MS SQL 2008 R2,我需要在特定列上创建一个带有 CHECK 的表,但我收到此错误。你能指出我正确的方向吗?谢谢

HeatingSystem   tinyint             NOT NULL
    CONSTRAINT  CK_ReProperties_HeatingSystem   CHECK(Size between 0 and 3),

错误

消息 8141,第 16 级,状态 0,第 1 行 列 'HeatingSystem' 的列 CHECK 约束引用另一列,表 'ReProperties'。 消息 1750,第 16 级,状态 0,第 1 行 无法创建约束。查看以前的错误。

【问题讨论】:

  • 你想实现什么?如果 Size 不在 0 和 3 之间,则 HeatingSystem 必须为 0?
  • 我想限制 HeatingSystem 的可能值,因此 HeatingSystem 应该只接受 0、1、2、3
  • 如果你只是在 NOT NULL 后面加一个逗号,就可以了。

标签: sql sql-server-2008-r2


【解决方案1】:

在列级别内联定义的约束只能引用它们旁边定义的列。

要么将约束定义移到正确的列旁边,要么将约束定义移到表定义的末尾。

失败

CREATE TABLE HeatingSystem
(
Size INT,
HeatingSystem TINYINT CHECK(Size between 0 and 3)
)

成功

CREATE TABLE HeatingSystem
(
Size INT CHECK(Size between 0 and 3),
HeatingSystem TINYINT
)   

也成功了

CREATE TABLE HeatingSystem
(
Size INT ,
HeatingSystem TINYINT,
CHECK(Size between 0 and 3 AND HeatingSystem BETWEEN 1 AND 10)
)  

最后一种方式还允许您声明一个引用多个列的row level 约束。

【讨论】:

    【解决方案2】:

    有了你的评论,我不明白“Size”是从哪里来的......

    你就不能做

    CONSTRAINT  CK_ReProperties_HeatingSystem   CHECK(HeatingSystem between 0 and 3)
    

    【讨论】:

    • @GibboK 很好,你做到了
    【解决方案3】:

    我是如何解决的。

    HeatingSystem   tinyint             NOT NULL
        CONSTRAINT  CK_ReProperties_HeatingSystem   CHECK(HeatingSystem between 0 and 3),
    

    【讨论】:

      【解决方案4】:

      我尝试了您的查询,它给了我Invalid column name 'Size'. 的错误您应该写列名 - HeatingSystem 代替 size。使用以下内容:-

      HeatingSystem   tinyint             NOT NULL
       CONSTRAINT  CK_ReProperties_HeatingSystem   CHECK(HeatingSystem between 0 and 3),
      

      【讨论】:

        【解决方案5】:

        您可能只是在单词 CONSTRAINT 之前缺少一个逗号分隔符!!

        例如)如果在 sn-p 下面的 ([WorkLocationId]) 之后的 "," 缺失,则会抛出 ERROR Column CHECK constraint for column references another column 错误。

        这会抛出错误 -

        CREATE TABLE [MYSYSTEM].[User](
        [UserId] int Primary key NOT NULL,
        [UserName] [nvarchar](50) NULL,
        [UserStatus] [nvarchar](1) NULL,
        [CreatedDate] [Datetime] NOT NULL,
        [WorkLocationId] int NOT NULL Foreign Key References [HRSYSTEM].[WorkLocations]([WorkLocationId])
        CONSTRAINT [_UserStatusValues] CHECK ([UserStatus] IN ('A','I') )
        )
        

        这会起作用 -

        CREATE TABLE [MYSYSTEM].[User](
        [UserId] int Primary key NOT NULL,
        [UserName] [nvarchar](50) NULL,
        [UserStatus] [nvarchar](1) NULL,
        [CreatedDate] [Datetime] NOT NULL,
        [WorkLocationId] int NOT NULL Foreign Key References [HRSYSTEM].[WorkLocations]([WorkLocationId]),
        CONSTRAINT [_UserStatusValues] CHECK ([UserStatus] IN ('A','I') )
        )
        

        【讨论】:

          【解决方案6】:

          只需使用表级约束,即将约束移动到表定义的末尾。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-08
            • 1970-01-01
            • 1970-01-01
            • 2017-10-31
            • 2011-04-22
            • 1970-01-01
            相关资源
            最近更新 更多