gpt4 book ai didi

mysql - 在另一个表中引用 MySQL ENUM

转载 作者:行者123 更新时间:2023-11-29 06:13:46 25 4
gpt4 key购买 nike

我有一个创建为 SkillLevel 的表

CREATE TABLE `sklllevel` (
`Name` varchar(20) NOT NULL,
`level` enum('No Experience','Beginner','Expert','Advisor') DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

有值(value)观

INSERT INTO test.sklllevel (name,level) values ('No Experience','No Experience'),('Beginner','Beginner'),('Expert','Expert'),('Advisor','Advisor');

我想在另一个创建的表中使用 testSkill.tkSkill 引用 SkillLevel.Level:

CREATE TABLE `testskill` (
`pkid` int(11) NOT NULL,
`name` varchar(45) DEFAULT NULL,
`tkSkill` tinyint(4) DEFAULT NULL,
PRIMARY KEY (`pkid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我是否需要将 tkSkill 作为具有相同值集的 ENUM 来设置外键?这里的最佳做法是什么?

最佳答案

简短回答:枚举存储为数字,因此从技术上讲,您可以将它们作为 tinyint 使用 tkSkill 加入。

要将它用作外键,您确实需要让 tkSkilllevel 成为相同的枚举 - 但您需要 level 成为一个 unique 列作为外键,所以添加 unique 到它(非常准确:对于 InnoDB,你可以有非唯一的外键如果您手动创建索引,但非唯一外键通常不是一个好主意)。但是你应该考虑你在 sklllevel 中的 key 应该是什么,因为现在看起来你希望 Name 成为 key 。

独立于将它作为键,你应该将 tkSkill 定义为(相同的)枚举,以确保它们的意思相同,如果你想在某一时刻更改枚举(什么是坏主意!)和例如添加另一个技能级别;或者如果你想“读取”(直接理解)当你直接从表 testskill 中选择时的值而不需要加入 sklllevel;如果您想通过使用它们的枚举名称(例如,“Expert”而不是 3,但您可以同时使用两者)将值插入到 tkSkill 中,而无需在 sklllevel 中查找它们。

更长的答案:最佳做法是:不要使用枚举。根据“信念”,枚举可能稍微有用(如果有的话)的情况很少或只有少数。一个可能是您不想使用引用表来跳过连接以显示整数 ID 的文本值/描述。在您的设置中,您实际上使用的是引用表,但仍想使用枚举。

最接近使用枚举的最佳实践是将 tkSkill 定义为 testskill 中的枚举并且没有 sklllevel-表(引用表)。

但是,我再次敦促您不要使用枚举。您可以将表定义为

CREATE TABLE `sklllevel` (
`Id` tinyint(4) primary key,
`Name` varchar(20) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

然后使用该 ID 作为 tkSkill 的外键。甚至

CREATE TABLE `sklllevel` (
`Name` varchar(20) primary key
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

然后将 tkSkill 定义为 varchar(20) 并将其用作外键 - 虽然它会占用更多空间,但您将拥有“可读”值如果这是您首先使用枚举的原因,请在表中。

在这里你可以找到一些枚举的背景:8 Reasons Why MySQL's ENUM Data Type Is Evil

关于mysql - 在另一个表中引用 MySQL ENUM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37015491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com