代码之家  ›  专栏  ›  技术社区  ›  tom

强制所有列具有不同的值

  •  3
  • tom  · 技术社区  · 7 年前

    val# 不应在多个列中。可以选择多个列 empty 虽然(我不想用 NULL 而不是 .)

    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 回复  |  直到 7 年前
        1
  •  3
  •   Gordon Linoff    7 年前

    一种方法是相当痛苦的 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