【问题标题】:Error Code: 1215. Cannot add foreign key constraint (foreign keys)错误代码:1215。无法添加外键约束(外键)
【发布时间】: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 可以检查错误;但是,由于某种原因,我们似乎不能这样做。错误是什么,是否有替代方法?此外,当我填写具有外键的表时,我无法填写为外键保留的字段,对吧?另外,外键是否被认为是键?

【问题讨论】:

    标签: mysql database


    【解决方案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

              【讨论】:

              【解决方案9】:

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

              【讨论】:

                【解决方案10】:

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

                【讨论】:

                  猜你喜欢
                  • 2016-10-27
                  • 2016-05-01
                  • 2018-11-10
                  • 2018-05-13
                  • 2015-05-27
                  • 2017-09-18
                  相关资源
                  最近更新 更多