错误代码:1215。无法添加外键约束(外键)

Posted

技术标签:

【中文标题】错误代码:1215。无法添加外键约束(外键)【英文标题】:Error Code: 1215. Cannot add foreign key constraint (foreign keys) 【发布时间】:2013-07-15 12:05:46 【问题描述】:
CREATE DATABASE my_db;

CREATE TABLE class (
  classID int NOT NULL AUTO_INCREMENT,
  nameClass varchar(255),
  classLeader varchar(255),
  FOREIGN KEY (classLeader) REFERENCES student(studentID),
  PRIMARY KEY (classID));

CREATE TABLE student (
  studentID int NOT NULL AUTO_INCREMENT,
  lastName varchar(255),
  firstName varchar(255),
  classID int,
  FOREIGN KEY (classID) REFERENCES class(classID),
  PRIMARY KEY (studentID));

我试图通过使用外键来确保表之间的数据一致性,以便 DBMS 可以检查错误;但是,由于某种原因,我们似乎不能这样做。错误是什么,是否有替代方法?此外,当我填写具有外键的表时,我无法填写为外键保留的字段,对吧?另外,外键是否被认为是键?

【问题讨论】:

【参考方案1】:

最可能的问题是这一行:

FOREIGN KEY (classLeader) REFERENCES student(studentID),

classLeader 的数据类型是 VARCHAR(255)。这必须匹配被引用列的数据类型...student.studentID。当然,student 表必须存在,studentID 列必须存在,studentID 列应该是学生表的 PRIMARY KEY(虽然我相信 mysql 允许这是一个 UNIQUE KEY , 而不是 PRIMARY KEY, 甚至只是有一个索引。)

无论如何,这里缺少的是SHOW CREATE TABLE student;的输出


存在数据类型不匹配。

classLeader VARCHAR(255) 列不能是对studentID INT 的外键引用。

两列的数据类型必须匹配。

【讨论】:

创建数据库 my_db3;创建表类 (classID int NOT NULL AUTO_INCREMENT, nameClass varchar(255), classLeader int, FOREIGN KEY (classLeader) REFERENCES student(studentID), PRIMARY KEY (classID)); SHOW CREATE TABLE student (studentID int NOT NULL AUTO_INCREMENT, lastName varchar(255), firstName varchar(255), classID int, FOREIGN KEY (classID) REFERENCES class(classID), PRIMARY KEY (studentID)); @GEORGEReed..如果您可以发布您遇到的错误,那将会很有用。 07:25:05 CREATE TABLE class (classID int NOT NULL AUTO_INCREMENT, nameClass varchar(255), classLeader int, FOREIGN KEY (classLeader) REFERENCES student(studentID), PRIMARY KEY (classID)) 错误代码:1215。无法添加外键约束 0.094 秒 非常感谢。就我而言,不同之处在于表 A 上的字段是 Int(10) UNSIGNED,而表 B 上的字段是 Int(10)。这对于类型不匹配就足够了! :o @Ricardo Appleton:是的,这是不匹配的。我应该强调两列的数据类型必须匹配完全【参考方案2】:

您收到此错误是因为FOREIGN KEY (classLeader) REFERENCES student(studentID) studentIDclassLeader的数据类型不同。主键列和外键列的数据类型必须相同。

From MySQL Site:

外键和引用键中的对应列必须具有相似的数据类型。 整数类型的大小和符号必须相同。 字符串类型的长度不必相同。 对于非二进制(字符)字符串列,字符集和排序规则必须 > 相同。

【讨论】:

+1 这回答了问题;此答案确定导致错误的问题。 我要补充一点,使用无符号属性的列也可能导致此错误。两列必须具有相同的有符号或无符号定义。【参考方案3】:

虽然回答晚了,但希望对少数人有所帮助。

我遇到了同样的问题。但是,这里的数据类型也是相同的。

但是,当我检查 create table 语句时,我发现一个表是使用名为“MyISAM”的引擎创建的,而另一个表正在使用“InnoDB”。

SHOW CREATE TABLE <TABLE NAME>

然后我将两个表引擎都更改为“InnoDB”并且它工作(我能够创建外键)

【讨论】:

【参考方案4】:

确保在 sql 转储中有页眉和页脚,否则在恢复数据库时会看到各种错误

标题应该如下所示 -:

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

页脚应该如下所示 -:

/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

希望以上帮助

干杯 S

【讨论】:

【参考方案5】:

错误得到解决:

为这样的表创建外键

CREATE TABLE USERS_SO (
    USERNAME VARCHAR(10) NOT NULL,
    PASSWORD VARCHAR(32) NOT NULL,
    ENABLED SMALLINT,
    PRIMARY KEY (USERNAME)
);

下面的代码可以正常工作

CREATE TABLE AUTHORITIES_SO (
    USERNAME VARCHAR(10) NOT NULL,
    AUTHORITY VARCHAR(10) NOT NULL,
    FOREIGN KEY (USERNAME) REFERENCES USERS_SO(USERNAME)
);

【讨论】:

【参考方案6】:

确定您的表是否使用 InnoDB 引擎

首先,验证引擎是否为INNODB:

SHOW CREATE TABLE yourtable

如果不将引擎更改为 InnoDB:

ALTER TABLE yourtable ENGINE=INNODB;

【讨论】:

【参考方案7】:

除了其他答案中提到的所有属性外,两个表的 CHARSET 也应该匹配以成功映射它们之间的外键。

【讨论】:

【参考方案8】:

只需将 classID 的属性设置为 UNSIGNED

【讨论】:

这并没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review【参考方案9】:

将键的结束参考点设置为“唯一”

【讨论】:

【参考方案10】:

从 Query 中删除 Engine, CHARSET, COLLATE,然后 checkout 。它对我有用。

【讨论】:

以上是关于错误代码:1215。无法添加外键约束(外键)的主要内容,如果未能解决你的问题,请参考以下文章

错误代码:1215。无法添加外键约束(外键)

表不工作:1215。无法添加外键约束

创建外键时出错:MySQL 错误 1215:无法添加外键约束 [重复]

Laravel 迁移 - 一般错误:1215 无法添加外键约束

MYSQL Workbench - 错误:错误 1215:无法添加外键约束

MySQL 错误 1215:无法添加外键约束