ERROR: Error 1215: Cannot add foreign key constraint (have tried everything)

ERROR: Error 1215: Cannot add foreign key constraint (have tried everything)

很难找到这个错误是什么。

我用

SHOW ENGINE INNODB STATUS

得到这个错误:

2015-12-05 03:20:44 16c8 Error in foreign key constraint of table mydb/enroll:

    FOREIGN KEY (`sectno`)
    REFERENCES `mydb`.`section` (`sectno`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB:
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.

所以我认为可以安全地假设是 sectno 键和它引用的 table 给我带来了麻烦。

这是我的 "enroll" tables(它不允许我创建的 table)和 "section" tables

    -- -----------------------------------------------------
-- Table `mydb`.`section`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`section` (
  `dname` VARCHAR(45) NOT NULL COMMENT '',
  `cno` INT NOT NULL COMMENT '',
  `sectno` INT NOT NULL COMMENT '',
  `pname` VARCHAR(45) NOT NULL COMMENT '',
  PRIMARY KEY (`sectno`, `dname`, `cno`)  COMMENT '',
  INDEX `fk_cno_section_idx` (`cno` ASC)  COMMENT '',
  INDEX `fk_pname_section_idx` (`pname` ASC)  COMMENT '',
  CONSTRAINT `fk_dname_section`
    FOREIGN KEY (`dname`)
    REFERENCES `mydb`.`dept` (`dname`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_cno_section`
    FOREIGN KEY (`cno`)
    REFERENCES `mydb`.`course` (`cno`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_pname_section`
    FOREIGN KEY (`pname`)
    REFERENCES `mydb`.`prof` (`pname`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`enroll`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`enroll` (
  `sid` INT NOT NULL COMMENT '',
  `grade` DOUBLE NULL COMMENT '',
  `dname` VARCHAR(45) NOT NULL COMMENT '',
  `cno` INT NOT NULL COMMENT '',
  `sectno` INT NOT NULL COMMENT '',
  PRIMARY KEY (`sid`, `dname`, `cno`, `sectno`)  COMMENT '',
  INDEX `fk_dname_enroll_idx` (`dname` ASC)  COMMENT '',
  INDEX `fk_cno_enroll_idx` (`cno` ASC)  COMMENT '',
  INDEX `fk_sectno_enroll_idx` (`sectno` ASC)  COMMENT '',
  CONSTRAINT `fk_sid_enroll`
    FOREIGN KEY (`sid`)
    REFERENCES `mydb`.`student` (`sid`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_dname_enroll`
    FOREIGN KEY (`dname`)
    REFERENCES `mydb`.`dept` (`dname`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_cno_enroll`
    FOREIGN KEY (`cno`)
    REFERENCES `mydb`.`course` (`cno`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_sectno_enroll`
    FOREIGN KEY (`sectno`)
    REFERENCES `mydb`.`section` (`sectno`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

我正在使用 MySQL workbench 正向工程,所以我实际上并没有自己输入代码。我已经检查、双重检查和三次检查,所有数据类型似乎都匹配,所以问题一定是这个错误:"Cannot find an index in the referenced table where the referenced columns appear as the first columns." 我不完全确定我 100% 理解它,但我想这意味着他们被引用的 FK 必须在被引用 table 的第一列中。所以在 table 部分,我喜欢..声明

 `sectno` INT NOT NULL COMMENT '',`

在所有其他列之前,所以它是 "first,",但仍然没有。我花了一个又一个小时又一个小时,我只是……精神疲惫。有人请帮忙

编辑:这是 table 的其余部分:

-- MySQL Workbench 正向工程

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `mydb` ;

-- -----------------------------------------------------
-- Table `mydb`.`student`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`student` (
  `sid` INT NOT NULL COMMENT '',
  `sname` VARCHAR(45) NULL COMMENT '',
  `sex` VARCHAR(10) NULL COMMENT '',
  `age` INT NULL COMMENT '',
  `year` INT NULL COMMENT '',
  `gpa` DOUBLE NULL COMMENT '',
  PRIMARY KEY (`sid`)  COMMENT '')
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`dept`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`dept` (
  `dname` VARCHAR(45) NOT NULL COMMENT '',
  `numphds` INT NULL COMMENT '',
  PRIMARY KEY (`dname`)  COMMENT '')
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`prof`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`prof` (
  `pname` VARCHAR(45) NOT NULL COMMENT '',
  `dname` VARCHAR(45) NOT NULL COMMENT '',
  PRIMARY KEY (`pname`)  COMMENT '',
  INDEX `fk_dname_prof_idx` (`dname` ASC)  COMMENT '',
  CONSTRAINT `fk_dname_prof`
    FOREIGN KEY (`dname`)
    REFERENCES `mydb`.`dept` (`dname`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`course`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`course` (
  `cno` INT NOT NULL COMMENT '',
  `cname` VARCHAR(45) NULL COMMENT '',
  `dname` VARCHAR(45) NOT NULL COMMENT '',
  PRIMARY KEY (`cno`, `dname`)  COMMENT '',
  INDEX `pk_dname_course_idx` (`dname` ASC)  COMMENT '',
  CONSTRAINT `pk_dname_course`
    FOREIGN KEY (`dname`)
    REFERENCES `mydb`.`dept` (`dname`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`major`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`major` (
  `dname` VARCHAR(45) NOT NULL COMMENT '',
  `sid` INT NOT NULL COMMENT '',
  PRIMARY KEY (`dname`, `sid`)  COMMENT '',
  INDEX `fk_sid_major_idx` (`sid` ASC)  COMMENT '',
  CONSTRAINT `fk_dname_major`
    FOREIGN KEY (`dname`)
    REFERENCES `mydb`.`dept` (`dname`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_sid_major`
    FOREIGN KEY (`sid`)
    REFERENCES `mydb`.`student` (`sid`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

这个脚本运行一直到现在。如果没有,请将顶部的两行更改为不同的架构名称,并且 运行 它没有任何 comment 部分处于活动状态。

由于这个原因,我目前找不到参考资料,但我在这里偶然发现了它。

明确一点,在某些界面中,comment 部分会引发错误。

不用说,它们 运行 的顺序很重要。

你的FK条件看起来都不错。数据类型和符号很好,并且从 referencingreferenced 表匹配。在 referenced 表中,它们在这些列上都有最左边的索引。

create schema asdf789;

use asdf789;


CREATE TABLE IF NOT EXISTS `section` (
  `dname` VARCHAR(45) NOT NULL COMMENT '',
  `cno` INT NOT NULL COMMENT '',
  `sectno` INT NOT NULL COMMENT '',
  `pname` VARCHAR(45) NOT NULL COMMENT '',
  PRIMARY KEY (`sectno`, `dname`, `cno`)  COMMENT '',
  INDEX `fk_cno_section_idx` (`cno` ASC)  COMMENT '',
  INDEX `fk_pname_section_idx` (`pname` ASC)  COMMENT ''
)ENGINE = InnoDB;


CREATE TABLE IF NOT EXISTS `student` (
  `sid` INT NOT NULL COMMENT '',
  `sname` VARCHAR(45) NULL COMMENT '',
  `sex` VARCHAR(10) NULL COMMENT '',
  `age` INT NULL COMMENT '',
  `year` INT NULL COMMENT '',
  `gpa` DOUBLE NULL COMMENT '',
  PRIMARY KEY (`sid`)  COMMENT '')
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`dept`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `dept` (
  `dname` VARCHAR(45) NOT NULL COMMENT '',
  `numphds` INT NULL COMMENT '',
  PRIMARY KEY (`dname`)  COMMENT '')
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`prof`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `prof` (
  `pname` VARCHAR(45) NOT NULL COMMENT '',
  `dname` VARCHAR(45) NOT NULL COMMENT '',
  PRIMARY KEY (`pname`)  COMMENT '',
  INDEX `fk_dname_prof_idx` (`dname` ASC)  COMMENT '',
  CONSTRAINT `fk_dname_prof`
    FOREIGN KEY (`dname`)
    REFERENCES `dept` (`dname`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`course`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `course` (
  `cno` INT NOT NULL COMMENT '',
  `cname` VARCHAR(45) NULL COMMENT '',
  `dname` VARCHAR(45) NOT NULL COMMENT '',
  PRIMARY KEY (`cno`, `dname`)  COMMENT '',
  INDEX `pk_dname_course_idx` (`dname` ASC)  COMMENT '',
  CONSTRAINT `pk_dname_course`
    FOREIGN KEY (`dname`)
    REFERENCES `dept` (`dname`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`major`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `major` (
  `dname` VARCHAR(45) NOT NULL COMMENT '',
  `sid` INT NOT NULL COMMENT '',
  PRIMARY KEY (`dname`, `sid`)  COMMENT '',
  INDEX `fk_sid_major_idx` (`sid` ASC)  COMMENT '',
  CONSTRAINT `fk_dname_major`
    FOREIGN KEY (`dname`)
    REFERENCES `dept` (`dname`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_sid_major`
    FOREIGN KEY (`sid`)
    REFERENCES `student` (`sid`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `enroll` (
  `sid` INT NOT NULL COMMENT '',
  `grade` DOUBLE NULL COMMENT '',
  `dname` VARCHAR(45) NOT NULL COMMENT '',
  `cno` INT NOT NULL COMMENT '',
  `sectno` INT NOT NULL COMMENT '',
  PRIMARY KEY (`sid`, `dname`, `cno`, `sectno`)  COMMENT '',
  INDEX `fk_dname_enroll_idx` (`dname` ASC)  COMMENT '',
  INDEX `fk_cno_enroll_idx` (`cno` ASC)  COMMENT '',
  INDEX `fk_sectno_enroll_idx` (`sectno` ASC)  COMMENT '',
  CONSTRAINT `fk_sid_enroll`
    FOREIGN KEY (`sid`)
    REFERENCES `student` (`sid`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_dname_enroll`
    FOREIGN KEY (`dname`)
    REFERENCES `dept` (`dname`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_cno_enroll`
    FOREIGN KEY (`cno`)
    REFERENCES `course` (`cno`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_sectno_enroll`
    FOREIGN KEY (`sectno`)
    REFERENCES `section` (`sectno`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;