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

MySQL曾经允许一个CHAR列FK到另一个tables ENUM列,但现在不允许了?,mysql,enums,foreign-key-relationship,Mysql,Enums,Foreign Key Relationship,旧电脑: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 CHA

旧电脑: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):无法添加外键约束

这是一个只在我家机器上运行的实验性数据库,不适用于工作或现实生活。我大约四年前就这样做了,现在我开始把东西移植到新买的家用电脑上


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

就像Bernd Buffen已经提到的那样,很可能在您的旧计算机上,这些表使用的是MyISAM引擎,这在当时是标准的。MyISAM会默默地忽略任何关于外键的规范,因为它不支持外键,现在仍然不支持外键。当你改变你的桌子时

ALTER TABLE <table name> ENGINE=InnoDB;
在MySQL 5.7中,它可能会显示:

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

在MySQL 5.0上,它将显示MyISAM。

CREATE TABLE语句中没有定义引擎。看看是否有一个是默认的MyISAM。然后在InnoDB中更改它。
+----------------------------+--------+
| Variable_name              | Value  |
+----------------------------+--------+
| default_storage_engine     | InnoDB |
| default_tmp_storage_engine | InnoDB |
| storage_engine             | InnoDB |
+----------------------------+--------+