2015-10-18 109 views
1

我想在mysql中創建codedata表,但得到錯誤#1215 - 無法添加外鍵約束。有人可以幫我弄清楚什麼是錯的?在此先感謝您的幫助!不能在mysql中創建表,因爲foriegn密鑰約束

這裏是行不通的代碼:

DROP TABLE IF EXISTS `interviewcodes`.`codedata` ; 

CREATE TABLE IF NOT EXISTS `interviewcodes`.`codedata` (
    `StudyID` INT(11) NOT NULL, 
    `ParticipantID` INT(11) NOT NULL, 
    `CoderID` INT(11) NOT NULL, 
    `CodingMonth` INT(11) NOT NULL, 
    `CodingDay` INT(11) NOT NULL, 
    `CodingYear` INT(11) NOT NULL, 
    `StudyQuestionLabel` VARCHAR(45) NOT NULL, 
    `StudyQuestionResponse` VARCHAR(245) NULL, 
    `IWAcode` INT(11) NULL DEFAULT 0, 
    `CQcode` INT(11) NULL DEFAULT 0, 
    `CRcode` INT(11) NULL DEFAULT 0, 
    `PMinusCode` INT(11) NULL DEFAULT 0, 
    `PPlusCode` INT(11) NULL DEFAULT 0, 
    `PROcode` INT(11) NULL DEFAULT 0, 
    `CONcode` INT(11) NULL DEFAULT 0, 
    `RELcode` INT(11) NULL DEFAULT 0, 
    `NOAcode` INT(11) NULL DEFAULT 0, 
    `OTHcode` INT(11) NULL DEFAULT 0, 
    `TotalScore` INT(11) NULL DEFAULT 0, 
    `Remark` VARCHAR(5000) NULL DEFAULT NULL, 
    INDEX `fk_CodeData_Participant1_idx` (`ParticipantID` ASC), 
    INDEX `fk_CodeData_StudyCoders1_idx` (`CoderID` ASC), 
    INDEX `fk_codedata_studyquestion1_idx` (`StudyQuestionLabel` ASC), 
    PRIMARY KEY (`StudyID`, `ParticipantID`, `CoderID`, `StudyQuestionLabel`), 
    CONSTRAINT `fk_CodeData_Participant1` 
    FOREIGN KEY (`ParticipantID`) 
    REFERENCES `interviewcodes`.`participant` (`ParticipantID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_CodeData_StudyCoders1` 
    FOREIGN KEY (`CoderID`) 
    REFERENCES `interviewcodes`.`studycoders` (`CoderID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_codedata_studylkup1` 
    FOREIGN KEY (`StudyID`) 
    REFERENCES `interviewcodes`.`studylkup` (`StudyID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_codedata_studyquestion1` 
    FOREIGN KEY (`StudyQuestionLabel`) 
    REFERENCES `interviewcodes`.`studyquestion` (`StudyQuestionLabel`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8; 

這裏是我用來創建其他表的代碼,其正確運行:

DROP TABLE IF EXISTS `interviewcodes`.`interviewerlkup` ; 

CREATE TABLE IF NOT EXISTS `interviewcodes`.`interviewerlkup` (
    `InterviewerID` INT(11) NOT NULL AUTO_INCREMENT, 
    `InterviewerFirstName` VARCHAR(45) NOT NULL, 
    `InterviewerLastName` VARCHAR(45) NOT NULL, 
    PRIMARY KEY (`InterviewerID`)) 
ENGINE = InnoDB 
AUTO_INCREMENT = 3 
DEFAULT CHARACTER SET = utf8; 


DROP TABLE IF EXISTS `interviewcodes`.`studylkup` ; 

CREATE TABLE IF NOT EXISTS `interviewcodes`.`studylkup` (
    `StudyID` INT(11) NOT NULL AUTO_INCREMENT, 
    `StudyName` VARCHAR(45) NOT NULL, 
    `StudyPIFirstName` VARCHAR(45) NULL, 
    `StudyPILastName` VARCHAR(45) NULL, 
    `StudyStartMonth` INT(11) NOT NULL, 
    `StudyStartDay` INT(11) NOT NULL, 
    `StudyStartYear` INT(11) NOT NULL, 
    PRIMARY KEY (`StudyID`)) 
ENGINE = InnoDB 
AUTO_INCREMENT = 4 
DEFAULT CHARACTER SET = utf8; 


DROP TABLE IF EXISTS `interviewcodes`.`studyinterviewers` ; 

CREATE TABLE IF NOT EXISTS `interviewcodes`.`studyinterviewers` (
    `StudyID` INT(11) NOT NULL, 
    `InterviewerID` INT(11) NOT NULL, 
    PRIMARY KEY (`StudyID`, `InterviewerID`), 
    INDEX `fk_StudyInterviewers_InterviewerLkup1_idx` (`InterviewerID` ASC), 
    CONSTRAINT `fk_StudyInterviewers_InterviewerLkup1` 
    FOREIGN KEY (`InterviewerID`) 
    REFERENCES `interviewcodes`.`interviewerlkup` (`InterviewerID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_StudyInterviewers_StudyLkup1` 
    FOREIGN KEY (`StudyID`) 
    REFERENCES `interviewcodes`.`studylkup` (`StudyID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8; 


DROP TABLE IF EXISTS `interviewcodes`.`participant` ; 

CREATE TABLE IF NOT EXISTS `interviewcodes`.`participant` (
    `ParticipantID` INT(11) NOT NULL AUTO_INCREMENT, 
    `ParticipantCaseID` VARCHAR(45) NOT NULL, 
    `StudyID` INT(11) NOT NULL, 
    `InterviewerID` INT(11) NOT NULL, 
    `InterviewMonth` INT(11) NULL DEFAULT NULL, 
    `InterviewDay` INT(11) NULL DEFAULT NULL, 
    `InterviewYear` INT(11) NULL DEFAULT NULL, 
    PRIMARY KEY (`ParticipantID`), 
    INDEX `fk_participant_studyinterviewers1_idx` (`InterviewerID` ASC), 
    CONSTRAINT `fk_participant_studyinterviewers1` 
    FOREIGN KEY (`InterviewerID`) 
    REFERENCES `interviewcodes`.`studyinterviewers` (`InterviewerID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_participant_studylkup1` 
    FOREIGN KEY (`StudyID`) 
    REFERENCES `interviewcodes`.`studylkup` (`StudyID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 
AUTO_INCREMENT = 6 
DEFAULT CHARACTER SET = utf8; 


DROP TABLE IF EXISTS `interviewcodes`.`coderlkup` ; 

CREATE TABLE IF NOT EXISTS `interviewcodes`.`coderlkup` (
    `CoderID` INT(11) NOT NULL AUTO_INCREMENT, 
    `CoderFirstName` VARCHAR(45) NOT NULL, 
    `CoderLastName` VARCHAR(45) NOT NULL, 
    PRIMARY KEY (`CoderID`)) 
ENGINE = InnoDB 
AUTO_INCREMENT = 3 
DEFAULT CHARACTER SET = utf8; 


DROP TABLE IF EXISTS `interviewcodes`.`studycoders` ; 

CREATE TABLE IF NOT EXISTS `interviewcodes`.`studycoders` (
    `StudyID` INT(11) NOT NULL, 
    `CoderID` INT(11) NOT NULL, 
    PRIMARY KEY (`StudyID`, `CoderID`), 
    INDEX `fk_StudyCoders_CoderLkup1_idx` (`CoderID` ASC), 
    CONSTRAINT `fk_StudyCoders_CoderLkup1` 
    FOREIGN KEY (`CoderID`) 
    REFERENCES `interviewcodes`.`coderlkup` (`CoderID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_StudyCoders_StudyLkup1` 
    FOREIGN KEY (`StudyID`) 
    REFERENCES `interviewcodes`.`studylkup` (`StudyID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8; 


DROP TABLE IF EXISTS `interviewcodes`.`studyquestion` ; 

CREATE TABLE IF NOT EXISTS `interviewcodes`.`studyquestion` (
    `StudyID` INT(11) NOT NULL, 
    `StudyQuestionLabel` VARCHAR(45) NOT NULL, 
    PRIMARY KEY (`StudyID`, `StudyQuestionLabel`), 
    CONSTRAINT `fk_StudyQuestion_StudyLkup` 
    FOREIGN KEY (`StudyID`) 
    REFERENCES `interviewcodes`.`studylkup` (`StudyID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8; 

這裏的最後一部分我的代碼後,我嘗試創建codedata表:

SET [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 


ALTER IGNORE TABLE `StudyLkup` ADD UNIQUE INDEX(`StudyName`); 
ALTER IGNORE TABLE `InterviewerLkup` ADD UNIQUE INDEX(`InterviewerFirstName`, `InterviewerLastName`); 
ALTER IGNORE TABLE `CoderLkup` ADD UNIQUE INDEX(`CoderFirstName`, `CoderLastName`); 
ALTER IGNORE TABLE `Participant` ADD UNIQUE INDEX(`ParticipantCaseID`, `StudyID`); 
ALTER IGNORE TABLE `StudyCoders` ADD UNIQUE INDEX(`StudyID`, `CoderID`); 
ALTER IGNORE TABLE `StudyInterviewers` ADD UNIQUE INDEX(`StudyID`, `InterviewerID`); 
ALTER IGNORE TABLE `StudyQuestion` ADD UNIQUE INDEX(`StudyID`, `StudyQuestionLabel`); 
ALTER IGNORE TABLE `CodeData` ADD UNIQUE INDEX(`StudyID`, `ParticipantID`, `CoderID`, `StudyQuestionLabel`); 
+0

這將是更快,有益的,如果你能提供給我們的外鍵被封鎖,所以我們可以直接看他們試圖幫助你。 –

+0

它不告訴我。我所知道的是,編碼表是包含錯誤的表。對不起,我無法確定哪一個。 – ajwong4

+0

我注意到fk_codedata_studylkup1沒有索引語句。這可以嗎? – ajwong4

回答

1

它將如果您執行這方面的工作:

CREATE TABLE IF NOT EXISTS `interviewcodes`.`studyquestion` (
    `StudyID` INT(11) NOT NULL, 
    `StudyQuestionLabel` VARCHAR(45) NOT NULL, 
    PRIMARY KEY (`StudyID`, `StudyQuestionLabel`), 
    key(`StudyQuestionLabel`), -- <-------- I added this 
    CONSTRAINT `fk_StudyQuestion_StudyLkup` 
    FOREIGN KEY (`StudyID`) 
    REFERENCES `interviewcodes`.`studylkup` (`StudyID`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION 
    ) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8; 

原因:缺少StudyQuestionLabel最左邊的問題。

雖然StudyQuestionLabel是一個複合鍵,它代碼,它不是最左邊的。

請注意,我創建了interviewcodes模式並對其進行了測試。

從手冊Using FOREIGN KEY Constraints報價:

... In the referencing table, there must be an index where the foreign key columns are listed as the first columns in the same order.

+0

完整[Pastie](http://pastie.org/10490873)與您的表在末尾 – Drew

+0

我會粘貼我的代碼上面的其餘部分。現在我收到錯誤:SQL查詢: SET SQL_MODE = @ OLD_SQL_MODE; MySQL說:文檔 #1231 - 變量'sql_mode'不能設置爲'NULL'的值 – ajwong4

+0

你的代碼的其餘部分是什麼?我剛剛在pastie中向你展示了它是如何工作的,通過改變我添加的最左邊的鍵 – Drew