强制所有列具有不同的值
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。或者,如果您想要可变数量的值,您可能只想将值存储在数组中。
特定的 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。或者,如果您想要可变数量的值,您可能只想将值存储在数组中。