问题描述
从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会解析并忽略外键规范。
无法禁用不支持的语法,甚至无法使其返回错误或警告。