可重现的例子:
SET FOREIGN_KEY_CHECKS=1; -- удостоверимся, что fk должны проверяться
create table testbase (
id int auto_increment primary key
) engine=innodb;
create table testfk (
parent_id int not null references testbase(id)
) engine=innodb;
insert into testfk values(3); -- ошибки нет!
Insert显然违反了外键的完整性,但不会导致错误,记录本身也被创建。alter table如果您清除表并通过这样创建外键:
alter table testfk add foreign key testfk_parent_fk (parent_id)
references testbase(id);
然后创建外键并随后检查约束。为什么后面没有限制create table?
不幸的是,在声明列时直接声明外键是这样一种对阅读文档注意力的考验:
references tablename(columnname)语法解析器理解字段声明中的声明并简单地忽略它。因此,下面两个create table是完全等价的,不会创建外键:顺便说一句,这种行为在查询结果中是可见的
show create table testfk,外键声明丢失了。因此insert,它可以写,根本没有外键。create table可以在单独的块中立即声明外键FOREIGN KEY:在这种情况下,将创建外键。