Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多行上的SQL约束_Sql_Oracle_Constraints - Fatal编程技术网

多行上的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的回答,这样在更新之后用户触发会更容易吗?在插入和更新之前,触发器在这里会很有帮助,非常感谢!!我用唯一索引解决了这个问题