Ошибка MySQL 1005 errno. 150 с первичными ключами

#mysql #sql #foreign-keys #innodb

#mysql #sql #внешние ключи #innodb

Вопрос:

Я добавляю функциональность в базу данных, которую я ранее создал. У меня есть таблица с именем «Test», которая содержит данные о серии вопросов. Эти данные могут включать в себя ряд динамических полей, добавленных пользователем, поэтому у меня есть таблица с именем Test_Header_Values, которая будет содержать данные о том, какое поле заголовка выполняется, и тест, частью которого оно является.

Пока все хорошо, я создал обе таблицы, но при создании внешнего ключа возникает ошибка 1215. Ранее у меня была ошибка 1005, но я попробовал другую базу данных, и она выдает 1215. Я проверял бесконечное количество раз типизацию, взаимосвязь, индексы, и это должно сработать, но я не могу это сделать.

Здесь у вас есть таблицы:

 CREATE TABLE `test` (
  `fk_id_checklist` int(10) unsigned NOT NULL,
  `sent_date` date NOT NULL,
  `fk_id_user` int(10) unsigned NOT NULL,
  `fk_id_user_company` int(10) unsigned NOT NULL,
  `start_date` date DEFAULT NULL,

  PRIMARY KEY (`fk_id_checklist`,`sent_date`,`fk_id_user`,`fk_id_user_company`),

  KEY `fk_user_test_idx` (`fk_id_user`,`fk_id_user_company`),

  CONSTRAINT `fk_test_user` FOREIGN KEY (`fk_id_user`, `fk_id_user_company`) 
    REFERENCES `user` (`id_user`, `fk_id_company`) 
    ON DELETE NO ACTION ON UPDATE NO ACTION,

  CONSTRAINT `fk_test_checklist` FOREIGN KEY (`fk_id_checklist`) 
    REFERENCES `checklist` (`id_checklist`) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE=InnoDB DEFAULT CHARSET=latin1;


CREATE TABLE `test_header_values` (
  `fk_id_checklist` int(10) unsigned NOT NULL,
  `fk_sent_date` date NOT NULL,
  `fk_id_field` int(10) unsigned NOT NULL,
  `fk_id_user` int(10) unsigned NOT NULL,
  `fk_id_user_company` int(10) unsigned NOT NULL,
  `value` varchar(64) NOT NULL,

  PRIMARY KEY (`fk_id_checklist`,`fk_id_field`,`fk_id_user`,`fk_id_user_company`,`fk_sent_date`),

  KEY `fk_field_idx` (`fk_id_field`),

  KEY `fk_values_test_idx` (`fk_id_checklist`,`fk_sent_date`,`fk_id_user`,`fk_id_user_company`),

  CONSTRAINT `fk_values_field` FOREIGN KEY (`fk_id_field`) REFERENCES `fields` (`id_field`) 
    ON DELETE NO ACTION ON UPDATE NO ACTION,

  CONSTRAINT `fk_values_test` FOREIGN KEY (`fk_id_checklist` , `fk_id_user` , `fk_id_user_company` , `fk_sent_date`) 
    REFERENCES `test` (`fk_id_checklist` , `fk_id_user` , `fk_id_user_company` , `sent_date`) 
    ON DELETE NO ACTION ON UPDATE NO ACTION

) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  

Если я удалю ограничение fk_values_test , оно будет работать отлично. С помощью этой строки возвращается вышеупомянутая ошибка.

Я следовал этому руководству и всем вопросам, которые я нашел в SO, но я не смог найти ошибку.

Ответ №1:

Я смог решить проблему.

По-видимому, индекс для внешнего ключа должен иметь тот же порядок столбцов, что и ограничение, которое я не нашел указанным.

Изменение ограничения на `fk_id_checklist` , `fk_id_user` , `fk_id_user_company` , `fk_sent_date` устраняет эту ошибку.