2015-12-05 84 views
1

找不到這個錯誤是不可能的。錯誤:錯誤1215:無法添加外鍵約束(嘗試了所有內容)

我用

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 `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的工作臺正向工程,所以我沒有實際鍵入自己出來的代碼。我已檢查並進行了雙重檢查和三重檢查,並且所有數據類型似乎都匹配,所以它必定是此問題,即問題:「無法在引用表中找到引用列作爲第一列顯示的索引。」我並不完全確定我已經100%瞭解它,但我認爲這意味着它們被引用的FK必須位於被引用表的第一列。所以在部分表格中,我喜歡..聲明

`sectno` INT NOT NULL COMMENT '',` 

之前的所有其他列,以便它是「第一」,仍然沒有。我一小時接一小時地度過,而我只是......精神疲憊。有人請幫助

編輯:這裏是表的其餘部分:

- MySQL工作臺正向工程

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@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; 
+0

你可以清理一下,這是在創建表的時候,還是用它們創建的 – Drew

+0

。我實際上已經創建了節表。這是在創建報名表時我遇到了困難。整個項目大約有7張桌子,我使用工作臺對所有圖表進行了前瞻性設計,這是報名表給我帶來的麻煩。這一次,我創建了每個表一個一個(而不是像我以前曾嘗試所有的一次)和eroll再次是問題表 – FrostyStraw

+0

你沒有告訴我們3其他4個表我們需要看到 – Drew

回答

1

運行此腳本通一路。如果沒有,請將頂部的兩行更改爲不同的模式名稱,並在沒有任何comment部分處於活動狀態的情況下運行它。

因爲這個原因,我找不到參考資料,但是我在這裏偶然發現了一個參考。

爲了清楚起見,在某些接口中,comment節會引發錯誤。

不用說,他們運行的順序很重要。

所有的FK條件看起來不錯。數據類型和符號很好,從參考參考表匹配。在引用的表中,它們在這些列上都有最左邊的索引。

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; 
+0

這工作!非常感謝你!但是,你從我的代碼改變了什麼? – FrostyStraw

+0

好吧,我得到了你的碎片,但下令讓他們成功。也許。我還在前兩行之外提到了對數據庫名稱的引用。所以也許這是一個數據庫名稱問題 – Drew

+1

啊是的,我看到你把部分放在頂部。那麼,它的工作對我來說已經足夠了,再次感謝 – FrostyStraw

相關問題