mysql - 在通过使用外键引用父表中的列来验证列条目时,我可以像枚举那样只输入索引号的快捷方式吗?
问题描述
我可以使用两种方法设置允许将哪些字符串值输入到列中 -
- 枚举
- 外键
但是使用 Enum 的一个优势在于 MySQL 使用数字索引 (1, 2, 3...) 来表示 String 值,并且任何数字条目都可以转换回相应的 String。这样可以节省打字时间。
我在下面的例子中说明了这一点 -
我创建了一个countries
具有以下结构的表 -
SHOW CREATE TABLE countries;
| countries | CREATE TABLE `countries` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`continent` enum('Africa','Asia','Europe','North America','Oceania','South America') DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
现在,我填充表格。这样做代替输入大陆名称时,我输入与大陆名称相对应的数字索引。这如下所示 -
INSERT INTO countries VALUES
-> (1, "South Africa", 1),
-> (2, "India", 2),
-> (3, "Russia", 3),
-> (4, "United States", 4),
-> (5, "Australia", 5),
-> (6, "Brazil", 6);
如下所示,数字索引已被翻译回相应的大陆名称 -
SELECT * FROM countries;
+----+---------------+---------------+
| id | name | continent |
+----+---------------+---------------+
| 1 | South Africa | Africa |
| 2 | India | Asia |
| 3 | Russia | Europe |
| 4 | United States | North America |
| 5 | Australia | Oceania |
| 6 | Brazil | South America |
+----+---------------+---------------+
现在我创建一个continent
具有如下结构的父表 -
SHOW CREATE TABLE continents;
| continents | CREATE TABLE `continents` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(40) NOT NULL,
PRIMARY KEY (`id`),
KEY `i_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
然后我创建一个子表countries2
,其中列通过使用continent
引用name
表中的列continent
foreign key
SHOW CREATE TABLE countries2;
| countries2 | CREATE TABLE `countries2` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`continent` varchar(40) NOT NULL,
PRIMARY KEY (`id`),
KEY `fk_continent` (`continent`),
CONSTRAINT `fk_continent` FOREIGN KEY (`continent`) REFERENCES `continents` (`name`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
我填充了continents
现在的表格 -
SELECT * FROM continents;
+----+---------------+
| id | name |
+----+---------------+
| 1 | Africa |
| 2 | Asia |
| 3 | Europe |
| 4 | North America |
| 5 | Oceania |
| 6 | South America |
+----+---------------+
现在我填充表格countries2
,但是在这里输入列的值时,continent
我必须输入整个大陆名称,而不是像第一种情况那样只输入数字索引。
INSERT INTO countries2 VALUES
-> (1, "South Africa", "Africa"),
-> (2, "India", "Asia"),
-> (3, "Russia", "Europe"),
-> (4, "United States", "North America"),
-> (5, "Australia", "Oceania"),
-> (6, "Brazil", "South America");
SELECT * FROM countries2;
+----+---------------+---------------+
| id | name | continent |
+----+---------------+---------------+
| 1 | South Africa | Africa |
| 2 | India | Asia |
| 3 | Russia | Europe |
| 4 | United States | North America |
| 5 | Australia | Oceania |
| 6 | Brazil | South America |
+----+---------------+---------------+
那么,有没有一种方法可以让我使用外键引用验证列,但又可以少输入一些内容?
解决方案
推荐阅读
- vba - MS Access - 过滤组合框以仅显示未使用的值
- javascript - 在运行同一网站的两个不同浏览器之间简单共享文本
- javascript - 无法读取节点中具有云功能的属性?
- java - Arraylist 给出奇怪的结果
- python-3.x - SocketIO、Python-SocketIO 和 Flask-SocketIO 不匹配的问题
- airflow - 气流任务未启动但停留在“正在运行”
- python - python中的“TypeError:字符串索引必须是整数”
- jquery - jquery 在同一个函数中使用两个完成的回调,一个具有数据类型 json 一个没有
- ms-word - 我的话 365 已经停止工作。多次改正无果
- java - 为什么在 HashMap 中获取 ConcurrentModificationException