Oracle 约束检查条件为 null 和 not null

标签 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')
    AND status IS NOT NULL) 

现在我添加了列 colour .我想指定是否 barracks被构造,然后 colour应仅为 RED,列 STATUS 应为 NOT NULL

如果兵营被摧毁

然后colour应为 BLACK,列 STATUS 应为 NULL。

所以这是我写的检查约束:
 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') )))  

如果颜色是RED,我仍然可以插入的问题NULL进专栏status .如何以一种检查我上面提到的条件的方式解决这个约束?

最佳答案

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

( status IN('Destroyed', 'constructed') 
         AND status IS NULL) 

然后,您还有一个更简单的检查条件:
( ( status is not null and color = 'RED') 
   or ( status is null and color = 'BLACK') 

至少您应该有两个单独的检查约束:一个用于验证 STATUS 的值,另一个用于验证 COLOR 与是否填充 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 修复“已构建”中的拼写错误,或者重写一些复杂的检查约束。

关于Oracle 约束检查条件为 null 和 not null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17238612/

相关文章:

oracle - 如何在 Oracle 中缩小安全文件 LOB

sql - Oracle 包间歇性返回空表的问题

java - 修复无效标识符的错误

java - 敏感可滚动结果集不反射(reflect) Oracle 数据库中的数据库更改

sql - Oracle SQLPlus 列出多个表中带有 'having' 的值

SQL 连接与子查询 - 性能差异

java - SELECT 查询的性能 - Oracle/JDBC

sql - PL SQL如何选择所有列

php - 将表情符号从 php Web 应用程序传递到 Oracle 数据库和 mysql

sql - Toad 只在 sql 中给出日期