3

我使用 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 无法创建约束。请参阅以前的错误。

4

6 回答 6

13

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

将约束定义移动到正确的列旁边,或者将约束定义移动到表定义的末尾。

失败

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)
)  

最后一种方法还允许您声明引用多列的行级约束。

于 2012-06-25T07:09:26.703 回答
0

这是我如何解决的。

HeatingSystem   tinyint             NOT NULL
    CONSTRAINT  CK_ReProperties_HeatingSystem   CHECK(HeatingSystem between 0 and 3),
于 2012-06-25T06:52:33.130 回答
0

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

你就不能做吗

CONSTRAINT  CK_ReProperties_HeatingSystem   CHECK(HeatingSystem between 0 and 3)
于 2012-06-25T06:53:29.550 回答
0

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

HeatingSystem   tinyint             NOT NULL
 CONSTRAINT  CK_ReProperties_HeatingSystem   CHECK(HeatingSystem between 0 and 3),
于 2012-06-25T06:59:04.960 回答
0

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

例如)如果在下面的片段中([WorkLocationId])之后的“,”缺失,那么它将抛出 ERROR Column CHECK 约束,用于列引用另一个列错误。

这将引发错误 -

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') )
)
于 2017-03-02T22:14:05.430 回答
0

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

于 2019-09-10T16:03:07.567 回答