【问题标题】:SQL Check constraint on column referencing other columns列引用其他列的 SQL 检查约束
【发布时间】:2013-12-02 11:56:49
【问题描述】:

我想限制一列只有在另一列有值时才能有值。

示例:(这不起作用)

create table testConstraint (
col1 int not null identity(1, 1) primary key,
col2 int,
col3 int check (col2 is not null),
col4 int)

这是不可能的,因为他无法引用另一列。 错误:

列 'col3' 的列 CHECK 约束引用另一列, 表'testConstraint'。

另一个尝试是:(也不起作用)

create table testConstraint (
col1 int not null identity(1, 1) primary key,
col2 int,
col3 int,
col4 int)
GO

alter table testConstraint add constraint ck_columnNotNull check (case when col2 is null then col3 is null end)
GO

任何人都知道如何通过约束实现这一点?

【问题讨论】:

    标签: sql sql-server constraints


    【解决方案1】:

    你可以写一个触发器。

    你也可以试试这个

    (1)

    ALTER TABLE TestConstraint ADD CONSTRAINT
        CK_TestConstraint CHECK (NOT ( (col3 is not null) and (col2 is null) ))
    GO
    

    或者这个

    (2)

    ALTER TABLE TestConstraint ADD CONSTRAINT
    CK_TestConstraint CHECK 
    (
        ((col3 is not null) and (col2 is not null)) or 
        ((col3 is null) and (col2 is null))
    )
    GO
    

    取决于你到底需要什么。

    我刚刚测试了它,它工作正常,我想。

    insert into 
    TestConstraint
    (col2, col3, col4)
    values
    (null, 1, 2)
    
    -- ERROR
    
    insert into 
    TestConstraint
    (col2, col3, col4)
    values
    (1, 1, 2)
    
    -- OK
    

    【讨论】:

    • 详细说明:col2 是允许为 NULL 的外键。但是当 col2 有一个值时,col3 可能只有一个值。我知道它可以通过触发器实现,但我希望它也可以通过约束来实现。我发现触发器比约束更危险。
    【解决方案2】:
    ALTER TABLE testConstraint
    ADD CONSTRAINT ck_columnNotNull
    CHECK ( 1 = CASE
                    WHEN col2 IS NULL AND col3 IS NULL THEN 1 
                    WHEN col2 IS NOT NULL AND col3 IS NOT NULL THEN 1 
                ELSE 0 
            END)
    

    【讨论】:

    • 我认为他只想在“col3 不为空”但“col2 为空”时出错。你的表情做了一些不同的事情。此外,它可以简化为 - 请参阅我的答案中的 (2)。
    • @peter.petrov:你可能是对的,tom 可以在 WHEN 子句中添加任何条件。
    【解决方案3】:

    只需要简单的逻辑,加上它需要(根据您的第二次尝试)是一个表检查约束,因此您不能将其声明为与col3 的声明内联:

    create table testConstraint (
    col1 int not null identity(1, 1) primary key,
    col2 int,
    col3 int,
    col4 int)
    GO
    
    alter table testConstraint add constraint ck_columnNotNull check (
       col3 is null
    or col2 is not null
    )
    GO
    

    如果col3null,那么我们不关心col2 的值是什么。相反,如果它不是NULL,那么我们确实想要强制col2 不是为空。这就是or 的两侧有效地给我们的。

    【讨论】:

      猜你喜欢
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      相关资源
      最近更新 更多