当从 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 (!)
请参阅示例数据库小提琴 https://www.db-fiddle.com/f/eUJ3zKx6JiFAYx5w7mqbrg/2.
但是,如果我创建外键输入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
请参阅运行示例数据库小提琴 https://www.db-fiddle.com/f/xhsYGvHC7ybwyic6BU12Zy/0.
如果这是 MySQL 中真正的主要错误,有什么方法可以禁用错误的语法吗?
Note:我刚刚确认 MariaDB 在 10.4 之前都存在相同的错误,但似乎在 10.5 中已修复。
MySQL 中未修复。它允许合法的SQL语法,但MySQL在使用列级外键语法时不保存约束。
这在 2005 年被报告为一个错误,并以“无法修复”消息结束。
https://bugs.mysql.com/bug.php?id=13301 https://bugs.mysql.com/bug.php?id=13301
https://dev.mysql.com/doc/refman/8.0/en/ansi-diff-foreign-keys.html https://dev.mysql.com/doc/refman/8.0/en/ansi-diff-foreign-keys.html says:
MySQL 解析但忽略“内联引用规范”(如 SQL 标准中定义),其中引用被定义为列规范的一部分。仅当指定为单独的 FOREIGN KEY 规范的一部分时,MySQL 才接受 REFERENCES 子句。对于不支持外键的存储引擎(例如MyISAM),MySQL Server会解析并忽略外键规范。
无法禁用不受支持的语法,甚至无法使其返回错误或警告。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)