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

4

11 回答 11

61

最可能的问题是这一行:

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

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

于 2013-07-17T04:55:26.847 回答
8

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

来自 MySQL 网站

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

于 2013-07-17T05:07:34.580 回答
5

虽然这是一个迟到的答案,但我希望它对少数人有所帮助。

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

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

SHOW CREATE TABLE <TABLE NAME>

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

于 2017-08-25T10:51:12.860 回答
0

错误得到解决:

为这样的表创建外键

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)
);
于 2015-04-15T12:45:29.660 回答
0

确保在 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 */;

希望以上有所帮助

干杯小号

于 2015-05-03T08:53:36.507 回答
0

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

于 2020-01-29T15:44:35.460 回答
0

与问题没有直接关系,但与问题的标题有关Error Code: 1215. Cannot add foreign key constraint(弄清楚这是因为以下原因:

存储生成列的基列上的外键约束不能使用 CASCADE、SET NULL 或 SET DEFAULT 作为 ON UPDATE 或 ON DELETE 引用操作。

https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html

我正在使用生成的列并在外键约束上使用这些 CASCADE 选项之一

于 2022-01-28T00:56:37.987 回答
-1

只需将 classID 的属性设置为 UNSIGNED

于 2020-09-10T07:10:19.283 回答
-1

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

于 2017-01-30T18:15:12.313 回答
-1

确保您的表使用 InnoDB 引擎

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

SHOW CREATE TABLE yourtable

如果不将引擎更改为 InnoDB:

ALTER TABLE yourtable ENGINE=INNODB;
于 2019-10-07T11:18:15.707 回答
-2

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

于 2018-02-19T09:14:04.503 回答