假设我有一个表inventory
,其中有列item_id
,category
和size
。
item_id
是自动递增的整数(主键)category
是ENUM size
是ENUM 我希望size
是有条件的ENUM。 “有条件”是指category=shoes
,size
的值为5、6、7、8、35、36、37、38等,而category=tshirt
,{ {1}}的值为S,M,L等。
对于带有size
的项目,不应将其category=shoes
用作S。
解决此问题的正确方法是什么?
答案 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);