强制所有列具有不同的值

时间:2019-01-09 15:02:02

标签: sql postgresql database-trigger check-constraints

特定的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 (???)
... );

有效组合,例如:

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 :(得分:3)

一种方法是在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')
          );

但是,我会提醒您有关数据结构的信息。您可能应该有一个联结/关联表,每个val和some_table id包含一行。或者,如果您想要可变数量的值,则可能只想将它们存储在数组中。