errno: 150 “Foreign key constraint is incorrectly formed”

  • Post author:
  • Post category:其他



原文链接:这里

0.问题及办法

数据库使用外键时,报这个错。

1005 – Can’t create table

myapp

.

#sql-1bb4_1d

(errno: 150 “Foreign key constraint is incorrectly formed”)

看样子是主键的类型不一致导致的。

我的sql数据如下

– 创建学生表

DROP TABLE IF EXISTS

students

;

CREATE TABLE

students

(


id

int(10) unsigned NOT NULL AUTO_INCREMENT,


stu_name

varchar(20) NOT NULL COMMENT ‘学生姓名’,


stu_sex

varchar(10) NOT NULL COMMENT ‘学生性别’,


class_id

int(10) NOT NULL COMMENT ‘年级’,


age

int(10) NOT NULL DEFAULT 18 COMMENT ‘年龄’,


create_time

datetime NULL DEFAULT CURRENT_TIMESTAMP,


update_time

datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

PRIMARY KEY (

id

)

) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8;

– 创建年级表

DROP TABLE IF EXISTS

grade

;

CREATE TABLE

grade

(


grade_id

int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘年级id’,

grade_name varchar(20) NOT NULL COMMENT ‘年级的名字’,

teacher_name varchar(10) NOT NULL COMMENT ‘班主任’,

teacher_phone int(11) NOT NULL COMMENT ‘班主任电话’,


create_time

datetime NULL DEFAULT CURRENT_TIMESTAMP,


update_time

datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

PRIMARY KEY (

grade_id

)

)ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8;

– 创建外键(适用于一开始创建表的时候没有外键的情况)

ALTER TABLE students

ADD CONSTRAINT class_id FOREIGN KEY(

class_id

) REFERENCES

grade

(

grade_id

)

仔细检查,确实是,grade表的 grade_id 字段中有个 unsigned ,而students表中class_id 没有unsigned。所以会报错。解决办法也很简单,把两者统一就行。

另外,出了这个问题,可以从下面这些方面考虑:

1、外键的引用类型不一样,如主键是int外键是char

2、找不到主表中引用的列

3、主键和外键的字符编码不一致,也可能存储引擎不一样