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

时间:2013-07-17 04:44:21

标签: mysql database

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可以检查错误;然而,似乎我们不能出于某种原因这样做。什么是错误,有替代方案吗?另外,当我填写一个有外键的表时,我无法填写为外键保留的字段,对吗?是否外键被认为是关键?

10 个答案:

答案 0 :(得分:47)

最可能的问题是这一行:

FOREIGN KEY (classLeader) REFERENCES student(studentID),

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

在任何情况下,这里缺少的是SHOW CREATE TABLE student;

的输出

数据类型不匹配。

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

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

答案 1 :(得分:7)

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

From MySQL Site:

Corresponding columns in the foreign key and the referenced key must have similar data types. 
The size and sign of integer types must be the same. 
The length of string types need not be the same. 
For nonbinary (character) string columns, the character set and collation must be the same.

答案 2 :(得分:3)

虽然这是一个迟到的答案,但我希望它能帮助很少的人。

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

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

SHOW CREATE TABLE <TABLE NAME>

然后我将两个表引擎更改为&#34; InnoDB&#34;它工作(我能够创建外键)

答案 3 :(得分:1)

错误得到解决:

为像这样的表创建外键

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)
);

答案 4 :(得分:0)

确保在sql dump中有页眉和页脚,否则在恢复数据库时会看到所有类型的错误

标题应如下所示:

/*!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 */;

希望以上帮助

干杯 小号

答案 5 :(得分:0)

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

答案 6 :(得分:0)

确保您的表是否正在使用InnoDB引擎

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

SHOW CREATE TABLE yourtable

如果未将引擎更改为InnoDB:

ALTER TABLE yourtable ENGINE=INNODB;

答案 7 :(得分:0)

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

答案 8 :(得分:0)

只需将classID的属性设置为UNSIGNED

答案 9 :(得分:-1)

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