2017-04-05 30 views
1

我身边有SQL限制这个问题,以实现以下行为:SQL约束条件检查:如果column0为null,列1不为空,反之亦然

TableA中有两列 column0和COLUMN1,只一个可以为NULL数据录入: 如: 如果column0为null,COLUMN1不能为空 如果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都因为这个约束的拒绝

+0

哪个RDBMS是这样的?请添加一个标签来指定您是使用'mysql','postgresql','sql-server','oracle'还是'db2' - 或者其他的东西。 –

+1

这不仅检查没有两个零位,这个强制只有一个null。 – iguypouf

+0

@marc_s使用postgresql对不起 – shabang

回答

3

条件你描述意味着至少有一个人必须具有价值。所以你的约束应该纠正为:

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

好了!这个问题并没有说两个非null值应该失败。 – SqlZim

+0

@Zack我真是个笨蛋!通过这种方式,我应该简化我的逻辑。阅读更好!谢谢 – shabang

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 | 
+---------+---------+ 
+0

谢谢你提到rextester工具@SqlZim,我有其他问题导致失败 – shabang