【问题标题】:Major bug in MySQL 8.x? -- foreign keysMySQL 8.x 中的主要错误? -- 外键
【发布时间】:2020-12-22 22:40:20
【问题描述】:

在从 MySQL(用于代码生成器)检索外键信息时,我注意到了这种奇怪的行为。它看起来像是 MySQL 8.x 中的一个主要错误。当我使用REFERENCES 创建外键时,引擎不会强制执行它。例如:

create table p (
  id int primary key not null
) engine=innodb;

create table q (
  pid int references p (id)
) engine=innodb;

insert into q (pid) values (123); -- succeeds (!)

参见DB Fiddle 的示例。

但是,如果我创建输入 FOREIGN KEY (col) REFERENCES table (col) 的外键,它可以正常工作:

create table p (
  id int primary key not null
) engine=innodb;

create table r (
  pid int,
  foreign key (pid) references p (id)
) engine=innodb;

insert into r (pid) values (456); -- fails, as expected

DB Fiddle查看运行示例。

如果这是 MySQL 中真正的主要错误,是否有任何方法可以禁用错误的语法?

注意:我刚刚验证 MariaDB 在 10.4 之前存在相同的错误,但它似乎已在 10.5 中修复。

【问题讨论】:

    标签: mysql sql foreign-keys mariadb


    【解决方案1】:

    在 MySQL 中未修复。它允许合法的 SQL 语法,但 MySQL 在使用列级外键语法时不保存约束。

    这在 2005 年被报告为一个错误,并以“无法修复”消息结束。

    https://bugs.mysql.com/bug.php?id=13301

    https://dev.mysql.com/doc/refman/8.0/en/ansi-diff-foreign-keys.html 说:

    MySQL 解析但忽略“内联引用规范”(如 SQL 标准中所定义),其中引用被定义为列规范的一部分。 MySQL 仅在指定为单独的 FOREIGN KEY 规范的一部分时才接受 REFERENCES 子句。对于不支持外键的存储引擎(如 MyISAM),MySQL Server 会解析并忽略外键规范。

    无法禁用不受支持的语法,甚至无法使其返回错误或警告。

    【讨论】:

    • 哇。我的意思是,也许对于 2005 年的标准来说这还可以,但现在我 [个人] 预计这样的事情会消失。谢谢(你的)信息。好吧,至少 MariaDB 的人已经处理好了。
    • 我一直认为这种行为,接受语法但忽略强制执行约束并且不返回警告,是 MySQL 最糟糕的特性之一。我之前已经给他们反馈过这个问题。但我理解为什么可插拔存储引擎架构难以修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 2020-05-19
    • 2010-12-21
    相关资源
    最近更新 更多