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

PostgreSQL条件枚举

  •  1
  • yiksanchan  · 技术社区  · 6 年前

    假设我有一张桌子 inventory 带柱 item_id , category size .

    1. 项目编号 是自动递增的整数(主键)
    2. 类别 是枚举
    3. 大小 是枚举

    我想要 大小 作为条件枚举。“有条件”是指 category=shoes , 大小 值为5、6、7、8、35、36、37、38等,而对于 category=tshirt , 大小 具有s、m、l等值。

    对于带有 类别=鞋子 它的 大小 不允许作为S。

    解决这个问题的正确方法是什么?

    2 回复  |  直到 6 年前
        1
  •  1
  •   TomC    6 年前

    我认为这样做的方法是创建额外的表,例如CategorySize,它在类别和大小上有一个复合主键,然后将其用作库存表中的外键。

    这样,您只允许库存中有效的组合。

    不再是真正的枚举,但至少意味着只有一致的、有效的数据最终会出现在数据库中。

    要使用架构添加外键,请执行以下操作:

    ALTER TABLE inventory 
    ADD CONSTRAINT fk_category_size 
    FOREIGN KEY (category_enum,size_enum) 
    REFERENCES category_size (category_enum,size_enum);
    
        2
  •  2
  •   clemens    6 年前

    您可以通过一个复杂的检查约束来实现这一点,例如:

    ALTER TABLE inventory ADD CONSTRAINT inventory_size_check
    CHECK((category = 'shoes' AND size BETWEEN '5' AND '45') OR
          (category = 'tshirt' AND size BETWEEN 'S' AND 'XXL'));
    

    枚举 size 必须包含所有类别的所有大小。