Ограничение SQL на более чем одну строку - PullRequest
2 голосов
/ 18 октября 2019

У меня есть таблица PROPERTY_RUNTIME, имеющая столбцы PROPERTY_NAME AND PROPERTY_VALUE

таблица PROPERTY_RUNTIME

Я добавляю ограничение для создания значений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.

Поэтому мне интересно, есть ли у меня логическая ошибка в ограничении?
Заранее спасибо!

1 Ответ

1 голос
/ 18 октября 2019

Вы можете использовать уникальный индекс для применения этого правила в нескольких строках следующим образом:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...