由于foriegn键约束,无法在mysql中创建表

时间:2015-10-18 15:20:36

标签: mysql

我试图在mysql中创建codedata表但得到错误#1215 - 无法添加外键约束。有人可以帮我弄清楚有什么不对吗?提前感谢您的帮助!

这是不起作用的代码:

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 SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_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`);

1 个答案:

答案 0 :(得分: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引用:

  

...在引用表中,必须有一个外部索引   键列以相同的顺序列为第一列。