有多种选择的MySQL列?

有多种选择的MySQL列?,mysql,sql,Mysql,Sql,我想知道,因为我是新使用MySQL的,是否有一种方法可以在一个表中的一列上有多个选项,同时选择多个选项。 假设我正在创建一个视频游戏表,并且某些游戏标题可以在多个平台(PC、PS3、XBox等)上使用。有没有办法在表中设置一个名为“平台”的列,并且可以选择多个选项? 编辑:我已经尝试过使用枚举,但除非我忽略了一些东西,否则我不能使用它选择多个选项。 谢谢您可以使用SET指定可以组合的值列表 然而,这通常被认为是糟糕的表设计,因为很难连接使用多值列的表。对于多对多关系,通常最好使用关系表。研究数据

我想知道,因为我是新使用MySQL的,是否有一种方法可以在一个表中的一列上有多个选项,同时选择多个选项。 假设我正在创建一个视频游戏表,并且某些游戏标题可以在多个平台(PC、PS3、XBox等)上使用。有没有办法在表中设置一个名为“平台”的列,并且可以选择多个选项? 编辑:我已经尝试过使用枚举,但除非我忽略了一些东西,否则我不能使用它选择多个选项。
谢谢

您可以使用
SET
指定可以组合的值列表

然而,这通常被认为是糟糕的表设计,因为很难连接使用多值列的表。对于多对多关系,通常最好使用关系表。研究数据库规范化以了解更多信息

TABLE Game (GameID, GameName, ...)
TABLE Platform (PlatformID, PlatformName, ...)
TABLE GamePlatform (GameID, PlatformID)
如果游戏#1在平台#2、#3和#7上可用,则在表
GamePlatform
中有三条记录:

INSERT INTO GamePlatform(GameID, PlatformID) VALUES (1, 2), (1, 3), (1, 7)

这有一个解决办法。这里的缺点是您必须为此添加一个新表

第一步:为所有控制台类型创建一个表
console

id | name
---------
1  |  PS3
2  |  Xbox
3  |  Wii
还有一张可以分组的桌子。假设游戏id1是马里奥卡丁车。你可以在PS3和Xbox上玩。然后你有下一个

id | gameId | consoleId
------------------------
1  |   1    |    2
2  |   1    |    1
其中
gameId
是指向
game
表的FK,而
consoleId
是指向
控制台的FK。

第一列
id
是可选的(不是必需的)。

您甚至可以创建一个varchar类型的字段并存储数字,用逗号分隔,(1,2,5,8),并映射到实际的平台名称。然后您可以使用mysql的FIND_IN_集合来匹配特定的数字,如


如果您关心表变大时的性能和/或需要正确的表设计,请不要使用此选项。

可以在列中添加多个选项,但这样做有一个缺点,因为您需要查找值的长度,并使用INSTR()和/或SUBSTR()查找位置(这很乏味,可能会有问题)


更好的解决方案是使用连接表,多对多(m:n),将游戏ID和平台ID设置为自己表中的主键。

您需要创建一个关系设计。@FreshPrinceOfSO所说的,尽管您也可以使用。该领域的知识称为“数据库理论”和“关系模型”。Date“数据库系统简介”是一个不错的选择,但当然还有其他来源。它不仅仅是一个解决办法。它是一个很好的设计。额外的表通常被称为a。在列中使用逗号分隔的列表是一种反模式。请参阅“乱穿马路”一章“在书中。如果你要这样做,为什么要用VARCHAR而不是SET呢?@Barmar with SET,当你有一个新项目时,你需要使用ALTER TABLE。SET比VARCHAR有什么好处?很好。这就是为什么你应该使用多对多关系表,而不是任何类型的多值列。