多行上的SQL约束
我有一个表多行上的SQL约束,sql,oracle,constraints,Sql,Oracle,Constraints,我有一个表PROPERTY\u RUNTIME包含PROPERTY\u NAME和PROPERTY\u 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
PROPERTY\u RUNTIME
包含PROPERTY\u NAME
和PROPERTY\u 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违反约束
因此,我想知道约束中是否存在逻辑错误?提前谢谢 您可以使用唯一索引跨多行强制执行该规则,如下所示:
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
约束本身没有形式上的错误,但它并不反映您想要实现的逻辑。该约束一次只应用于一行-它检查PROPERTY_NAME和PROPERTY_VALUE中的值,并对相同的值应用条件(一次始终是单独的一行)。在当前的SQL(Oracle或任何其他供应商)中,同时对多行的约束非常难以实现。另外:有人对您的帖子进行了一些非常合理的编辑。然后你又过度编辑,搞得一团糟。不酷!您需要为这种类型的多行检查创建触发器谢谢您@mathguy的回答,这样在更新之后用户触发会更容易吗?在插入和更新之前,触发器在这里会很有帮助,非常感谢!!我用唯一索引解决了这个问题