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。
旧电脑: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。