Обеспечение того, чтобы все столбцы имели разные значения - PullRequest
0 голосов
/ 09 января 2019

Конкретный val# должен быть не более чем в одном столбце. Однако несколько столбцов могут быть empty. (Я не хочу использовать NULL вместо empty.)

CREATE TYPE vals AS ENUM ('val1', 'val2', 'val3', 'val4', 'val5', ... 'empty');
CREATE TABLE some_table
( ...
  column1 vals NOT NULL,
  column2 vals NOT NULL,
  column3 vals NOT NULL,
  CONSTRAINT some_table_column_vals_check CHECK (???)
... );

Допустимые комбинации, например ::10000

column1: val1
column2: val2
column3: val4

column1: val1
column2: empty
column3: empty

Недопустимые комбинации, например ::

column1: val1
column2: val3
column3: val3

column1: val2
column2: empty
column3: val2

Есть ли удобный способ сделать это с (желательно не слишком длинным) ограничением, или я должен написать для этого триггерную функцию?

1 Ответ

0 голосов
/ 09 января 2019

Один метод - довольно болезненное выражение case в ограничении check:

alter table some_table add constraint chk_some_tablefields
    check ( (val1 not in (val2, val3) or val1 = 'empty') and
            (val2 not in (val3) or val2 = 'empty')
          );

Однако я бы предупредил вас о вашей структуре данных. Вероятно, у вас должна быть таблица соединений / связей с одной строкой на значение и some_table id. Или вы можете просто сохранить значения в массиве, если вам нужно их переменное число.

...