Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle约束检查条件为null且不为null_Oracle - Fatal编程技术网

Oracle约束检查条件为null且不为null

Oracle约束检查条件为null且不为null,oracle,Oracle,我的问题是关于检查约束的,通常的语法是: ALTER TABLE barracks ADD CONSTRAINT chk_barracks CHECK( status IN('Destroyed', 'constructed')) 这意味着应该销毁或构造列状态 在下文中,我指定营房不接受空值 ALTER TABLE barracks ADD CONSTRAINT chk_barracks CHECK(status IN('Destroyed', 'constructed') A

我的问题是关于检查约束的,通常的语法是:

ALTER TABLE barracks
ADD CONSTRAINT chk_barracks CHECK( status IN('Destroyed', 'constructed'))  
这意味着应该销毁或构造列状态

在下文中,我指定营房不接受空值

 ALTER TABLE barracks
 ADD CONSTRAINT chk_barracks CHECK(status IN('Destroyed', 'constructed')
    AND status IS NOT NULL) 
现在我添加了列
color
。我想指定如果建造了
营房
,则
颜色
应仅为红色,列状态不应为空

如果营房被摧毁

然后,
颜色
应为黑色,列状态应为空

下面是我写的检查约束:

 ALTER TABLE barracks
 ADD CONSTRAINT chk_barracks CHECK( ((status IN ('Destroyed', 'constructed')
         AND status IS NOT NULL) 
         AND (color IN('RED') )) 
    OR (( status IN('Destroyed', 'constructed') 
         AND status IS NULL) 
         AND (color IN('BLACK') )))  

问题是,如果颜色是红色,我仍然能够将
NULL
插入列
status
。如何以一种方式解决该约束,它将检查我上面提到的条件?

使用检查约束强制执行诸如“已销毁”、“已构造”之类的值是个坏主意。改为使用查找表的外键。除此之外,这将防止逻辑上的荒谬,例如:

( status IN('Destroyed', 'constructed') 
         AND status IS NULL) 
然后还有一个更简单的检查条件:

( ( status is not null and color = 'RED') 
   or ( status is null and color = 'BLACK') 
至少应该有两个单独的检查约束:一个用于验证状态值,另一个用于验证颜色与是否填充状态之间的关系


更多关于外键的信息。创建如下表:

 create table barracks_statuses
     ( status varchar2 (15) not null
       , constraint bsts_pk primary key (status)
 organization index;

 insert into barracks_statuses values ( 'Destroyed');
 insert into barracks_statuses values ( 'constructed');
alter table barracks
    add constraint barr_bsts_fk foreign key (status)
        references (status);
然后强制执行外键,如下所示:

 create table barracks_statuses
     ( status varchar2 (15) not null
       , constraint bsts_pk primary key (status)
 organization index;

 insert into barracks_statuses values ( 'Destroyed');
 insert into barracks_statuses values ( 'constructed');
alter table barracks
    add constraint barr_bsts_fk foreign key (status)
        references (status);

这种方法很有用,因为它提供了更多的灵活性。您可以添加一个新状态,例如“已计划”或仅使用DML修复“已构建”中的打字错误,或者重写一些复杂的检查约束。

如果营房被摧毁,则颜色应为黑色,列应为空--哪一列应为空??@schurik I更正它,列状态:)列的值不可能同时为NULL和“已销毁”。你必须选择“销毁”或空:)@schurik如果我这样写,会更好吗?((状态为('destrocted','constructed')或状态为NULL)@schurik oh很好,解决方案是用以下方式替换和:ALTER TABLE barracks ADD CONSTRAINT chk_barracks CHECK((状态为('destrocted','constructed')和(颜色为('RED'))或((状态为)('Destructed'、'constructed')>>或status为NULL)和(color IN('BLACK')))APC您的意思是:改为使用查找表的外键?外键如何在我的表中帮助我?并检查它?我必须指定状态和颜色。