MySQL 外键错误解决方法

MySQL 外键错误解决方法

在使用MySQL的时候,可能会碰到报错提示“Foreign Key Constraint is incorrectly Formed”,这是表示外键约束错误,无法创建表。本文将介绍解决这个问题的方法。

阅读更多:MySQL 教程

导致外键错误的原因

让我们先来看一下什么是外键。外键用于连接两个表。表中的某个字段(或字段组合)被设定为外键,该字段的值将与另一个表的字段值进行比较,如果两个表中字段的值相同,则外键约束生效。

外键约束错误通常是因为以下几个原因:
– 外键列类型与被引用表列类型不一致
– 外键列名与被引用表列名不一致
– 外键表或被引用表不存在
– 被引用表主键列类型不是整数类型

接下来我们将针对每种情况给出一些说明。

外键列类型与被引用表列类型不一致

在创建表时,如果某个列做为外键时,它的数据类型与被引用表中的数据类型不一致会导致外键错误。例如,在创建一个表时,我们需要引用另一个表的主键列,但主键列的类型是int,而外键列的类型却是varchar(50)。

下面是一个示例错误的SQL语句:

CREATE TABLE table1 (
  id INT(11) NOT NULL AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  indexed_id VARCHAR(50) NOT NULL,
  PRIMARY KEY (id),
  FOREIGN KEY (indexed_id)
  REFERENCES table2(id)
  ON DELETE CASCADE
) ENGINE=InnoDB;
Mysql

其中,在引用 table2 表的主键列 id 作为外键时,我们使用的是 varchar(50),而实际上 table2 表中的id列类型是 int。

外键列名与被引用表列名不一致

在创建表时,如果某个列做为外键,它的列名与被引用表中的列名不一致会导致外键错误。例如,如果一个表的列名是 user_id,而另一个表的列名是 id,那么在创建外键时,两个表的列名应该一致。

下面是一个示例错误的SQL语句:

CREATE TABLE table1 (
  id INT(11) NOT NULL AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  indexed_id INT(11) NOT NULL,
  PRIMARY KEY (id),
  FOREIGN KEY (user_id)
  REFERENCES table2(id)
  ON DELETE CASCADE
) ENGINE=InnoDB;
Mysql

在引用 table2 表的主键列 id 作为外键时,我们使用的列名是 user_id,而实际上 table2 表中的id列名与之不一致,应该将user_id改为id。

外键表或被引用表不存在

创建外键时,外键列必须引用的是存在的表中的现有列。如果外键表或被引用表不存在,会导致外键错误。例如,在上述错误的示例中,如果 table2 表不存在,会导致外键错误。

被引用表主键列类型不是整数类型

在引用某个表的主键列时,必须保证该列类型为整数类型(int、bigint、smallint)。如果被引用表中的主键列类型不是整数类型,将无法使用其做为外键。

解决 MySQL 外键错误

要解决这个问题,我们需要进一步检查表的结构并根据上述原因进行修复。

在第一个示例中,我们需要确保外键列的类型与被引用表列的类型一致:

CREATE TABLE table1 (
  id INT(11) NOT NULL AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
 indexed_id INT(11) NOT NULL,
  PRIMARY KEY (id),
  FOREIGN KEY (indexed_id)
  REFERENCES table2(id)
  ON DELETE CASCADE
) ENGINE=InnoDB;
Mysql

在第二个示例中,我们需要确保外键列名与被引用表列名相同:

CREATE TABLE table1 (
  id INT(11) NOT NULL AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  user_id INT(11) NOT NULL,
  PRIMARY KEY (id),
  FOREIGN KEY (user_id)
  REFERENCES table2(id)
  ON DELETE CASCADE
) ENGINE=InnoDB;
Mysql

在第三个示例中,我们需要确保外键表和被引用表都存在:

CREATE TABLE table1 (
  id INT(11) NOT NULL AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  indexed_id INT(11) NOT NULL,
  PRIMARY KEY (id),
  FOREIGN KEY (indexed_id)
  REFERENCES table2(id)
  ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE table2 (
  id INT(11) NOT NULL AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB;
Mysql

在第四个示例中,我们需要将被引用表的主键列改为整数类型。

CREATE TABLE table1 (
  id INT(11) NOT NULL AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  indexed_id INT(11) NOT NULL,
  PRIMARY KEY (id),
  FOREIGN KEY (indexed_id)
  REFERENCES table2(id)
  ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE table2 (
  id VARCHAR(50) NOT NULL, -- 被引用表主键改为varchar类型
  name VARCHAR(50) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB;
Mysql

总结

在使用MySQL创建表时,外键约束错误是一个常见的错误。造成这个错误的原因可能有多种,但通常是因为外键列类型、列名或被引用表不存在等原因造成的。要解决这个问题,需要进一步检查表的结构并根据上述原因进行修复。我们希望,通过阅读本文,您能够更加深入的理解MySQL的外键约束,并且在使用MySQL时更加得心应手。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册