一、错误提示
ERROR 1215 (HY000): Cannot add foreign key constraint
二、过程描述
1.先是创建如下表
#创建学生表
Create TABLE Student
(Sno CHAR(9) PRIMARY KEY not null, /*列级完整性约束,Sno是主码*/
Sname CHAR(20) not null,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;/*指定字符集的编码方式为utf8,以便后续插入汉字型元组数据*/
2.然后创建如下表
#创建课程表
create table Course
(Cno CHAR(4) PRIMARY KEY not null, /*列级完整性约束,Sno是主码*/
Cname char(40) NOT NULL,
Cpno CHAR(4), /*Cpno是先修课*/
Ccredit SMALLINT,
FOREIGN KEY (Cpno) REFERENCES Course(Cno) /*表级完整性约束条件,Cpno是外码,被参照对象是Cource,被参照列是Cno*/
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
3.然后创建如下表
#创建选课表
CREATE TABLE SC
(Sno CHAR(9) not null ,
Cno CHAR(4) not null ,
Grade SMALLINT,
primary key (sno,cno),
foreign key (Sno) references Student(sno),
foreign key (Cno) references Course(cno)
);
4.在创建SC数据表时,报错如下
ERROR 1215 (HY000): Cannot add foreign key constraint
- 报错释义:不能添加外键约束
- 报错原因:因为SC数据表依赖于Student和Course表,但是Student和Course表的字符集编码方式指定为utf8(为了插入含中文的元组数据),而SC表的默认字符集编码方式为latin1,导致数据表引擎enging不匹配,故而报错。
三、解决
1.创建SC数据表时,也指定字符集编码方式为utf8
#创建选课表
CREATE TABLE SC
(Sno CHAR(9) not null ,
Cno CHAR(4) not null ,
Grade SMALLINT,
primary key (sno,cno),
foreign key (Sno) references student(sno),
foreign key (Cno) references Course(cno)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
四、其他可能引起ERROR 1215 (HY000)报错的原因
- 数据表单个属性列的数据类型不一致,就会引起该报错。这时只需要修改单个属性列的数据类型为一致即可
- 数据库主从表字符集不同
- 上述过程描述中引起的报错,是在创建表时,整个数据表的字符集编码方式不一致导致的;也就是多个表中相关列的数据类型不一致
- MySQL查看和修改字符集的方法
- 数据表引擎enging不匹配造成
参考:
1.MySQL : ERROR 1215 (HY000): Cannot add foreign key constraint