SQL检查对引用其他列的列的约束

时间:2013-12-02 11:56:50

标签: sql sql-server constraints

我想限制一个列,当另一列有值时,它只能有一个值。

示例:(这不起作用)

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约束引用另一列,   table'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

任何人都知道如何使用约束来实现这一目标?

3 个答案:

答案 0 :(得分:2)

你可以写一个触发器。

另外,你可以试试这个

(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

答案 1 :(得分:0)

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)

答案 2 :(得分:0)

只需要简单的逻辑,并且需要(根据您的第二次尝试)成为表检查约束,因此您不能使用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 null。这就是or的双方有效地给了我们的东西。