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您的意思是:改为使用查找表的外键?外键如何在我的表中帮助我?并检查它?我必须指定状态和颜色。