我想预定义mysql中列的可能值。
例如,列Fruits
可以将值apple, orange, mango
作为单个值,也可以作为apple,orange
,apple,mango
等列表。
eg:
juice fruites
---------------------
j1 'mango'
j2 'mango,apple'
j3 'apple,orange'
j4 'apple'
....etc
我可以找到check constraints
或Enum
来达到这个目的有没有更好的方法来实现这一目标?
因为我可能希望在此列表中添加更多元素,并在将来说grapes
,所以我现在使用的方法必须是广泛的。
如此善意地建议哪种方式最好,或者如果我必须使用constraint
或Enum
哪个更好,就容易扩展而言。
答案 0 :(得分:1)
我可以找到检查约束或Enum来达到这个目的有没有更好的方法来实现同样的目标?
是的,使用链接表对数据库进行规范化:
juice
id | name
1 j1
2 j2
fruit
id | name
1 mango
2 apple
juices_fruits
juice_id | fruit_id
1 1
2 1
2 2
使用适当的外键约束( juice_id引用juice.id和fruit_id引用fruit.id ),您只能将“有效”结果插入juices_fruits
表。另外,您可以在 juice_id,fruit_id 上使用unique_key约束,以确保没有水果被添加到同一果汁中两次。
要查询此内容,您可以使用group_concat
获取以逗号分隔的列表:
SELECT j.name, GROUP_CONCAT(f.name) FROM
juice j
LEFT JOIN
juices_fruits jf
on
jf.juice_id = j.id
LEFT JOIN
fruit f
ON
jf.fruit_id = f.id
GROUP BY
j.id;
结果:
j1 | mango
j2 | mango,apple
答案 1 :(得分:0)
" CHECK子句被解析但被所有存储引擎忽略。"
这会留下ENUM
和触发器作为您唯一的选择。
ENUM
具有更快一点的好处(因为它们只存储最多2个字节的数据),但更改它们可能需要更长的时间。
使用触发器,您可以定义所需的任何约束,并且在约束失败时也可以有自定义错误。改变它们并不取决于表格中的数据量。