MySQL: Can’t create table (errno: 150)
当我们创建MySQL数据库中的表的时候,偶尔会遇到错误信息:Can’t create table (errno: 150)。这是因为MySQL在创建表时,会检测表中的外键是否与相关表中的主键或唯一键匹配。如果出现任何不匹配,就会抛出Can't create table (errno: 150)
的错误信息。
下面,我们将分别从以下几个方面详细探讨这个错误:
阅读更多:MySQL 教程
数据类型
在MySQL中,主键和外键必须具有相同的数据类型。如果主键是整数类型,例如INT
,那么外键也必须是整数类型。如果主键是字符类型,例如VARCHAR
,那么外键也必须是字符类型。
缺失的索引
在MySQL中,外键需要在相关表中至少有一个索引,以保证外键能够与主键或唯一键进行匹配。如果相关表中没有与外键相关的索引,就会导致Can't create table (errno: 150)
的错误信息。在下面的示例中,我们创建了两个表,其中一个表中的外键未添加索引,从而导致了这个错误:
CREATE TABLE table1 (
id INT PRIMARY KEY
);
CREATE TABLE table2 (
id INT,
table1_id INT,
FOREIGN KEY (table1_id) REFERENCES table1(id)
);
错误的名称
在创建外键时,需要确保外键名称在整个数据库中是唯一的。如果外键名称与其他表或列中的名称冲突,就会出现Can't create table (errno: 150)
的错误信息。在下面的示例中,我们创建了两个表,其中一个表中的外键名称与主键名称冲突,从而导致了这个错误:
CREATE TABLE table1 (
id INT PRIMARY KEY
);
CREATE TABLE table2 (
id INT,
table1_id INT,
PRIMARY KEY (id),
FOREIGN KEY (table1_id) REFERENCES table1(id),
);
相反的顺序
在MySQL中,如果我们在创建表时指定了外键,必须先创建被引用的表,再创建引用的表。否则,就会出现Can't create table (errno: 150)
的错误信息。在下面的示例中,我们先创建了引用的表,然后创建了被引用的表:
CREATE TABLE table2 (
id INT PRIMARY KEY,
table1_id INT,
FOREIGN KEY (table1_id) REFERENCES table1(id)
);
CREATE TABLE table1 (
id INT PRIMARY KEY
);
总结
Can't create table (errno: 150)
错误信息一般都是由于外键和主键或唯一键不匹配导致的。在创建表时,我们需要确保外键和主键或唯一键具有相同的数据类型并且至少有一个索引。另外,我们还需注意外键名称在整个数据库中是唯一的,以及确保被引用的表优先于引用的表创建。