特定的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
是否有一种(最好不要太长)约束的简洁方法,还是我应该为此编写触发函数?
答案 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包含一行。或者,如果您想要可变数量的值,则可能只想将它们存储在数组中。