Таблица в mySQL с несколькими внешними ключами, которые являются первичными, вызывает ошибку. ОШИБКА 1215: Невозможно добавить ограничение внешнего ключа. - PullRequest
0 голосов
/ 30 мая 2018

Я создал эти таблицы:

CREATE TABLE `course` (
  `idcourse` varchar(2) NOT NULL,
  `courseName` varchar(45) NOT NULL,
  `subjectID` varchar(2) NOT NULL,
  PRIMARY KEY (`idcourse`),
  KEY `subjectID_idx` (`subjectID`),
  CONSTRAINT `subjectID` FOREIGN KEY (`subjectID`) REFERENCES `subject` (`idsubject`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1

CREATE TABLE `exam` (
  `subjectID` varchar(2) NOT NULL,
  `courseID` varchar(2) NOT NULL,
  `examNumber` varchar(2) NOT NULL,
  `duration` int(11) DEFAULT NULL,
  PRIMARY KEY (`subjectID`,`courseID`,`examNumber`),
  KEY `idCourse_idx` (`courseID`),
  CONSTRAINT `idCo` FOREIGN KEY (`courseID`) REFERENCES `course` (`idcourse`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `idSu` FOREIGN KEY (`subjectID`) REFERENCES `subject` (`idsubject`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1

CREATE TABLE `question` (
  `questionText` varchar(100) DEFAULT NULL,
  `answer1` varchar(100) DEFAULT NULL,
  `answer2` varchar(100) DEFAULT NULL,
  `answer3` varchar(100) DEFAULT NULL,
  `answer4` varchar(100) DEFAULT NULL,
  `subjetID` varchar(2) NOT NULL,
  `questionNumber` varchar(3) NOT NULL,
  `rightAnswer` int(4) DEFAULT NULL,
  PRIMARY KEY (`subjetID`,`questionNumber`),
  CONSTRAINT `idsubject` FOREIGN KEY (`subjetID`) REFERENCES `subject` (`idsubject`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1

CREATE TABLE `subject` (
  `idsubject` varchar(2) NOT NULL,
  `subjectName` varchar(45) NOT NULL,
  PRIMARY KEY (`idsubject`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

К теме таблица Я добавляю запись:

idsubject = 02, subjectName = Mathematica

К курс таблица Я добавляю запись:

idcourse =03, courseName = Алгебра 1, subjectID = 02

К экзамену к таблице я добавляю запись:

subjectID = 02, courseID = 03,examNumber = 01, продолжительность = 180

Теперь я хочу создать таблицу: questionsinexam

CREATE TABLE `test`.`questionsinexam` (
  `idExamSubject` VARCHAR(2) NOT NULL,
  `idExamCourse` VARCHAR(2) NOT NULL,
  `idExamNumber` VARCHAR(2) NOT NULL,
  `idQuestionNumber` VARCHAR(3) NOT NULL,
  `pointsPerQuestion` INT NULL,
  PRIMARY KEY (`idExamSubject`, `idExamCourse`, `idExamNumber`, `idQuestionNumber`),
  INDEX `idExamCourse_idx` (`idExamCourse` ASC),
  INDEX `idExamNumber_idx` (`idExamNumber` ASC),
  INDEX `idQuestionNumber_idx` (`idQuestionNumber` ASC),
  CONSTRAINT `idExamSubject`
    FOREIGN KEY (`idExamSubject`)
    REFERENCES `test`.`exam` (`subjectID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `idExamCourse`
    FOREIGN KEY (`idExamCourse`)
    REFERENCES `test`.`exam` (`courseID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `idExamNumber`
    FOREIGN KEY (`idExamNumber`)
    REFERENCES `test`.`exam` (`examNumber`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `idQuestionNumber`
    FOREIGN KEY (`idQuestionNumber`)
    REFERENCES `test`.`question` (`questionNumber`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION);

Почему я получаю эту ошибку?

Спасибо.

1 Ответ

0 голосов
/ 30 мая 2018

Это ограничение определенно неверно:

CONSTRAINT `idExamSubject`
    FOREIGN KEY (`idExamSubject`)
    REFERENCES `test`.`exam` (`subjectID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,

Возможно, вы намереваетесь:

CONSTRAINT `idExamSubject`
    FOREIGN KEY (`idExamSubject`)
    REFERENCES `test`.`subject` (`subjectID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,

Убедитесь, что вы создали целевые таблицы до того, как создадите чужуюключевое ограничение.Упомянутая таблица должна сначала существовать (поэтому механизм может проверять типы по столбцам, используемым для внешнего ключа).

...