【问题标题】:MySQL once allowed a CHAR column to FK to another tables ENUM column, but not anymore?MySQL 曾经允许一个 CHAR 列 FK 到另一个表的 ENUM 列,但现在不再了吗?
【发布时间】:2015-12-03 14:20:56
【问题描述】:

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

在旧电脑上运行结果:没问题

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

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

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

【问题讨论】:

  • CREATE TABLE 语句中没有定义引擎。看看一个是否是默认的 MyISAM。然后将其更改为 InnoDB。

标签: mysql enums foreign-key-relationship


【解决方案1】:

就像 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-19
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多