问题:
我想在students表中创建外键ClassID,关联到class表中的主键ClassID上,要求级联更新删除,但创建外键过程中显示Cannot add foreign key constraint。
先看一下关联表结构,
出现该问题时要考虑一下几点:
- 1、两张表所用引擎是否一致
- 2、关联两字段的类型是否一致
- 3、关联两字段配置是否一致
分步来看:
1、两表的存储引擎是否一致
查看单张表使用存储引擎的SQL语句:
show table status from database_name where name='table_name'\G;
结果如下:
可以看出classes表的引擎是MyISAM,想创建外键必须改为InnoDB
修改表引擎的SQL语句如下:
alter table table_name engine=engine_name;
修改后结果如下:
2、关联两字段的的类型是否一致
由之前的表结构可看出,两个字段的类型均为int(16)
如需修改字段类型,可用SQL语句:
alter table table_name modify col_name field_type;
3、关联字段的配置是否一致
由上边表结构可以看出,classes表中ClassID的default值为0,而students表中ClassID的default值为NULL,因此需要修改字段的default。
修改字段default的SQL语句:
alter table table_name alter column col_name drop default;//之前有default需先删除
alter table table_name alter column col_name set default def_value;
修改后结果为:
三步修改完成后再次尝试创建外键
alter table table_name add foreign key(key) references table2_name(key) on update cascade on delete cascade;
操作成功,结果如下: