2015-10-18 76 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