SQL约束超过一行

时间:2019-10-18 14:34:29

标签: sql oracle constraints

我有一个表PROPERTY_RUNTIME,该表的列为PROPERTY_NAMEPROPERTY_VALUE

table PROPERTY_RUNTIME

我正在添加一个约束,以使CNT_DISP_PREP1CNT_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>

所以我想知道约束中是否有任何逻辑错误?
预先感谢!

1 个答案:

答案 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