错误代码: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)
studentID
和classLeader
的数据类型不同。主键列和外键列的数据类型必须相同。
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。无法添加外键约束(外键)的主要内容,如果未能解决你的问题,请参考以下文章
创建外键时出错:MySQL 错误 1215:无法添加外键约束 [重复]
Laravel 迁移 - 一般错误:1215 无法添加外键约束