MySQL 曾经允许一个 CHAR 列 FK 到另一个表的 ENUM 列,但现在不行了?

MySQL once allowed a CHAR column to FK to another tables ENUM column, but not anymore?

旧电脑:MySQL版本5.0.51

新电脑:MySQL 版本 5.7.9

DDL 片段:

CREATE TABLE lookup (
    keyvalue ENUM ('A', 'B', 'C', 'D') NOT NULL;
    CONTSTRAINT lookuppk PRIMARY KEY (keyvalue)
);

CREATE TABLE othertable (
    otherkey INT(5) NOT NULL AUTO_INCREMENT,
    refkey CHAR(1),
    CONSTRAINT otherpk PRIMARY KEY (otherkey),
    CONSTRAINT reffk FOREIGN KEY (refkey) REFERENCES lookup(keyvalue)
);

在旧计算机上 运行 时的结果:没问题

在新计算机上 运行 时的结果:错误 1215 (HY000):无法添加外键约束

这是一个实验性数据库 运行仅在我的家用计算机上使用,不适用于工作或现实生活。我大约四年前开始这样做,现在我开始将东西迁移到新购买的家用电脑上。

错误似乎只是外键必须与引用列的数据类型完全匹配。事后看来,这是一个糟糕的设计,我年纪大了,也更聪明了,我可以改变。但是让我好奇的是为什么旧的 MySQL 版本允许这样做。我查看了文档,但找不到任何内容。

就像 Bernd Buffen 已经提到的,很可能在您的旧计算机上,表格使用的是 MyISAM 引擎,这是当时的标准。 MyISAM 默默地忽略任何关于外键的规范,因为它不支持并且仍然不支持它们。当您使用

更改表格时
ALTER TABLE <table name> ENGINE=InnoDB;

您将在旧计算机上遇到相同的错误。

您还可以使用以下查询来验证这一点:

show variables like '%storage%';

在MySQL 5.7中它可能会显示:

+----------------------------+--------+
| Variable_name              | Value  |
+----------------------------+--------+
| default_storage_engine     | InnoDB |
| default_tmp_storage_engine | InnoDB |
| storage_engine             | InnoDB |
+----------------------------+--------+

在 MySQL 5.0 上它会显示 MyISAM。