版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lzw2016/article/details/82822222
今天在写数据库作业时,遇到的无法创建外键问题
create table department
(dept_name varchar(20),
building varchar(15),
budget numeric(12,2) check (budget > 0),
primary key (dept_name)
);
create table course
(course_id varchar(8),
title varchar(50),
dept_name varchar(20),
credits numeric(2,0) check (credits > 0),
primary key (course_id),
foreign key (dept_name) references department
on delete set null
);
需要了解几点,什么是主键外键?自己查;约束?表的主键和其他表的外键关联时,要求数据类型和属性都相同。
嗯,我确认了一遍,类型和属性都相同。最后发现是 reference 后面只有父表的名,却没有对应列的信息references department
。改成references department(dept_name)
就好了(建表SQL文件是从SQLserver拿过来的,语法不同吧)。
常见几种无法创建外键的可能
- 父表不存在
- 先创建父表,再创建子表;
SET FOREIGN_KEY_CHECKS=0;
后,创建子表,再创建父表;SET FOREIGN_KEY_CHECKS=1;
- 标点符号使用不对
- 对应列名拼错
- 对应列的数据类型和属性不一致
- 父表和子表 表(或列)的字符集 或 排序集 不同
- 父表中相关列上没有任何索引
- 父表相关列有索引,但索引是一个多列索引,同时该列不是该做索引最左列
- 父表不是innodb
- 父表是分区表
- MySQL5.7以上,父表中相应列是虚拟列,不是实际存储列
- reference 后面没有列信息
- 对约束操作使用 SET DEFAULT
你可以创建失败时,使用
SHOW ENGINE INNODB STATUS\G
,显示更多具体的错误信息,而非仅仅Err 1215.
详细疑问解释和解决方法可参考:Dealing with MySQL Error Code 1215: “Cannot add foreign key constraint”