微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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会解析并忽略外键规范。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。