将列值限制为预定义的字符串列表

时间:2015-07-17 07:16:58

标签: mysql sql

我想预定义mysql中列的可能值。

例如,列Fruits可以将值apple, orange, mango作为单个值,也可以作为apple,orangeapple,mango等列表。

eg:
    juice       fruites
    ---------------------
    j1          'mango'
    j2          'mango,apple'
    j3          'apple,orange'
    j4          'apple'
    ....etc

我可以找到check constraintsEnum来达到这个目的有没有更好的方法来实现这一目标?

因为我可能希望在此列表中添加更多元素,并在将来说grapes,所以我现在使用的方法必须是广泛的。

如此善意地建议哪种方式最好,或者如果我必须使用constraintEnum哪个更好,就容易扩展而言。

2 个答案:

答案 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个字节的数据),但更改它们可能需要更长的时间。

使用触发器,您可以定义所需的任何约束,并且在约束失败时也可以有自定义错误。改变它们并不取决于表格中的数据量。