SQL约束条件检查:如果column0为null,则column1不为null,反之亦然

时间:2017-04-05 16:24:21

标签: sql postgresql constraints check-constraints

我有关于SQL约束的问题,以便实现以下行为:

TableA有两列 column0和column1,数据条目中只有一个可以为NULL: 例如。: 如果column0为null,则column1不能为null 如果column1为null,则column0不能为null

为此,我构建了以下SQL约束:

CONSTRAINT column01_not_null_chk
CHECK (
  ( column0 IS NOT NULL
  AND column1 IS NULL )
OR
  ( column1 IS NOT NULL
  AND column0 IS NULL ) )

这是否正确实现我的行为?因为所有SQL都因此约束而被拒绝

2 个答案:

答案 0 :(得分:3)

您描述的条件意味着其中至少有一个必须具有价值。因此,您的约束应该更正为:

CONSTRAINT column01_not_null_chk
CHECK (column0 IS NOT NULL OR column1 IS NOT NULL)

答案 1 :(得分:1)

似乎在SQL Server上正常工作:

create table t (
     column0 int null
   , column1 int null
, CONSTRAINT column01_not_null_chk
CHECK (
  ( column0 IS NOT NULL
  AND column1 IS NULL )
OR
  ( column1 IS NOT NULL
  AND column0 IS NULL ) )
);

insert into t values (null,1),(1,null);

select * from t;
--insert into t values (null,null) /* fail */
--insert into t values (1,1) /* fail */

rextester 演示http://rextester.com/OQZNE39497

返回:

+---------+---------+
| column0 | column1 |
+---------+---------+
| NULL    | 1       |
| 1       | NULL    |
+---------+---------+