首页 > 解决方案 > 在通过使用外键引用父表中的列来验证列条目时,我可以像枚举那样只输入索引号的快捷方式吗?

问题描述

我可以使用两种方法设置允许将哪些字符串值输入到列中 -

  1. 枚举
  2. 外键

但是使用 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表中的列continentforeign 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 |
+----+---------------+---------------+

那么,有没有一种方法可以让我使用外键引用验证列,但又可以少输入一些内容?

标签: mysqlindexingenumsforeign-keys

解决方案


推荐阅读