MySQL 8.x中的主要错误? -外键

问题描述

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语法,但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会解析并忽略外键规范。

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