#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`
устраняет эту ошибку.