我有一个表PROPERTY_RUNTIME
,该表的列为PROPERTY_NAME
和PROPERTY_VALUE
我正在添加一个约束,以使CNT_DISP_PREP1
和CNT_DISP_PREP2
的值不能同时等于0:
ALTER TABLE KLASSX.PROPERTY_RUNTIME
ADD (
CONSTRAINT CK_BOTH_LINE_CLOSE
CHECK (
(
CASE
WHEN
(
((PROPERTY_NAME = 'CNT_DISP_PREP1') AND (PROPERTY_VALUE = '1'))
OR
((PROPERTY_NAME = 'CNT_DISP_PREP2') AND (PROPERTY_VALUE = '1'))
)
THEN 1
ELSE 0
END
) = 1
)
DISABLE NOVALIDATE);
但是,当我激活约束并输入四个组合:1 / 1、1 / 0、0 / 1、0 / 0时,所有四个组合都违反约束,而不是仅违反0/0。 / p>
所以我想知道约束中是否有任何逻辑错误?
预先感谢!
答案 0 :(得分:1)
您可以使用唯一索引来跨多个行实施该规则,如下所示:
FSITJA@db01> create table property_runtime (property_name varchar2(30), property_value varchar2(1));
Table created.
FSITJA@db01> create unique index ck_both_line_close on property_runtime (
2 case when property_name in ('CNT_DISP_PREP1', 'CNT_DISP_PREP2') and property_value = '0'
3 then 1 end)
4 ;
Index created.
FSITJA@db01> insert into property_runtime values ('CNT_DISP_PREP1', '1');
1 row created.
FSITJA@db01> insert into property_runtime values ('CNT_DISP_PREP2', '1');
1 row created.
FSITJA@db01> insert into property_runtime values ('CNT_DISP_PREP1', '0');
1 row created.
FSITJA@db01 2019-10-18 11:46:08> insert into property_runtime values ('CNT_DISP_PREP2', '0');
insert into property_runtime values ('CNT_DISP_PREP2', '0')
*
ERROR at line 1:
ORA-00001: unique constraint (FSITJA.CK_BOTH_LINE_CLOSE) violated
FSITJA@db01> insert into property_runtime values ('CNT_DISP_PREP1', '0');
insert into property_runtime values ('CNT_DISP_PREP1', '0')
*
ERROR at line 1:
ORA-00001: unique constraint (FSITJA.CK_BOTH_LINE_CLOSE) violated