PostgreSQL条件ENUM

时间:2018-10-03 05:39:13

标签: sql postgresql enums

假设我有一个表inventory,其中有列item_idcategorysize

  1. item_id是自动递增的整数(主键)
  2. category是ENUM
  3. size是ENUM

我希望size是有条件的ENUM。 “有条件”是指category=shoessize的值为5、6、7、8、35、36、37、38等,而category=tshirt,{ {1}}的值为S,M,L等。

对于带有size的项目,不应将其category=shoes用作S。

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

2 个答案:

答案 0 :(得分:2)

您可以通过复杂的检查约束来实现此目标,例如:

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必须包含所有类别的所有大小。

答案 1 :(得分:1)

我认为这样做的方法是创建其他表,例如CategorySize,该表在Category和Size上具有复合主键,然后将其用作库存表中的外键。

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

不再真正枚举,但至少意味着只有一致,有效的数据才能存储在数据库中。

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

ALTER TABLE inventory 
ADD CONSTRAINT fk_category_size 
FOREIGN KEY (category_enum,size_enum) 
REFERENCES category_size (category_enum,size_enum);