一、Cannot add foreign key constraint是一种典型的外键约束错误。
首先我们得知道什么是外键约束:外键约束是一种数据库约束,它指定一个表的一列或多列的值必须匹配其他表中的主键或唯一键值。外键约束确保数据的引用完整性,防止在关联关系中存在不一致或无效的数据。例如,一个订单表可能包含一个客户ID列,以指示该订单是哪个客户创建的。在这种情况下,客户ID列将是订单表的外键,并将参考客户表的主键或唯一键。当试图插入或更新订单表中的数据时,外键约束将验证客户ID列中的值是否存在于客户表中,并防止插入无效的值。
二、为什么会出现外键约束错误?
1.字符段类型不一致
例如:我们这里有两张表,分别是职务部门表(dept)和员工表(emp),我们想用dept表的id(int)去连接emp表的demp_id(varchar),两个属性类型不一致。只需要修改其中一个表单的属性即可
语法:
ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
2.编码格式不一致
查看表单的编码格式语句:
show create table 表名;
表单编码格式可能为latin1或者为utf8。修改编码的语句:
alter table user default character set utf8;
alter table user change name name varchar(40) character set utf8;
具体原因可查看我的上一篇博客:[HY000][1366] lncorrect string value:‘\xE6\x9F\xB3lxE5lxB2\xA9 ‘ for column or row 1怎么办
3.存储引擎不一致
查看引擎的语法:
show create table 表名;
将两张表单的引擎都改为InnoDB引擎即可,
修改引擎的语句:
alter table 表名 ENGINE = InnoDB;
4.外键字段不能为主表的主键。例如:主表emp的主键id不能作为外键字段与从表dept的id作为外键联接字段。
5.从表的外键字段联接字段必须为该表单的主键。例如:dept的id必须为dept表单主键。
主键设置语句:
alter table dept add constraint pk_dept primary key (id);