以下条件约束根本不起作用。有可能以一种有效的方式制定吗?
ALTER TABLE eni_trasc_voci_pwr_fatt
ADD CONSTRAINT tvp_constraint_1 CHECK (
CASE WHEN TVP_CODICE_ASSOGGETAMEN = '-' THEN tvp_regione IS NULL
END);
答案 0 :(得分:5)
尝试以下方法:
ALTER TABLE eni_trasc_voci_pwr_fatt
ADD CONSTRAINT tvp_constraint_1 CHECK (
CASE WHEN TVP_CODICE_ASSOGGETAMEN = '-' THEN tvp_regione else null end IS NULL);
答案 1 :(得分:3)
看起来你想要逻辑蕴涵(“如果X然后是Y”),这在逻辑上等同于“(不是X)或Y”。 CASE用于创建有限地图。
你的约束应该是
TVP_CODICE_ASSOGGETAMEN != '-' OR TVP_REGIONE IS NULL
答案 2 :(得分:2)
我认为如果没有案例陈述,你可以做你想做的事情:
create table t1 (c1 varchar2(10), c2 varchar2(10));
alter table t1 add constraint t1_chk1 check ( (c1 = '-' and c2 is null) or (c1 != '-' and c2 is not null) );
现在尝试插入一些值:
SQL> insert into t1 values ('-', 'reject');
insert into t1 values ('-', 'reject')
*
ERROR at line 1:
ORA-02290: check constraint (SODONNEL.T1_CHK1) violated
SQL>
SQL> insert into t1 values ('-', null);
1 row created.
SQL>
SQL> insert into t1 values ('a', null);
insert into t1 values ('a', null)
*
ERROR at line 1:
ORA-02290: check constraint (SODONNEL.T1_CHK1) violated
SQL>
SQL> insert into t1 values ('a', 'accept');
1 row created.