gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 17:41:57 24 4
gpt4 key购买 nike

我创建了一个技能级别表

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 来设置外键?这里的最佳实践是什么?

最佳答案

简短回答:枚举存储为数字,因此从技术上讲,您可以将它们与 tkSkill 作为tinyint 连接起来。

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

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

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

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

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

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/49958222/

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