强制所有列具有不同的值

Enforcing that all columns have different values

特定的 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

有没有一种巧妙的方法可以通过(最好不要太长)约束来做到这一点,或者我应该为此编写一个触发函数吗?

一种方法是 check 约束中相当痛苦的 case 表达式:

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')
          );

但是,我要提醒您注意您的数据结构。您可能应该有一个 junction/association table 每个 val 一行和 some_table id。或者,如果您想要可变数量的值,您可能只想将值存储在数组中。