暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 强制column1或column2中的任何一个不为null

askTom 2018-10-31
190

问题描述

嗨,
我有一个表,我需要任何一列不为null,这意味着在任何时间点,只有这些列中的一个应该有一个值,而另一个应该为null。

我试过下面:
CREATE TABLE "BCKC"."TEST" 
   ( "ID" NUMBER(9,0), 
 "TEXT" VARCHAR2(7), 
 "ADR" VARCHAR2(4), 
  CONSTRAINT "L_COL_CHK" CHECK ( text IS NOT  NULL OR adr IS NOT NULL) ENABLE
   ) ;

INSERT INTO  test values(1,'er','nzb');
INSERT INTO test values(1,'er','nzb');
复制


我仍然能够在两列中插入值,这不是我的要求。

我正在考虑触发器,并且还看到触发器可能会减慢插入速度。

任何帮助将不胜感激。

-谢谢




专家解答

所以你在找一个独家的还是?

您的约束检查至少有一个不为null。要确保只有一个是空,你还需要测试另一个是空:

CREATE TABLE TEST  ( 
  ID NUMBER(9,0), 
  TEXT VARCHAR2(7), 
  ADR VARCHAR2(4), 
  CONSTRAINT L_COL_CHK 
    CHECK ( 
      ( text IS NOT NULL AND adr IS NULL ) OR 
      ( text IS NULL AND adr IS NOT NULL )
    )
) ;

INSERT INTO test VALUES ( 1,'er','nzb' );

ORA-02290: check constraint (CHRIS.L_COL_CHK) violated

INSERT INTO test VALUES ( 2,'er',NULL );
INSERT INTO test VALUES ( 3,NULL,'nzb' );
INSERT INTO test VALUES ( 4,NULL,NULL );

ORA-02290: check constraint (CHRIS.L_COL_CHK) violated

select * from test;

ID   TEXT     ADR      
   2 er          
   3    nzb      
复制

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论