Ошибка при создании иностранного ключа
-
18-09-2019 - |
Вопрос
Я получаю эту ошибку, пытаясь добавить порученный внешний ключ:
#1005 - Can't create table './testtable/#sql-595_146.frm' (errno: 150)
Мне нужно сделать каскад с удалением для всех изображений, которые разделяют идентификатор проекта, когда этот проект удален. Моя упрощенная структура таблицы заключается в следующем:
CREATE TABLE IF NOT EXISTS `images` (
`image_id` mediumint(8) unsigned NOT NULL auto_increment,
`project_id` smallint(6) NOT NULL,
PRIMARY KEY (`image_id`),
KEY `project_id_ix` (`project_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=28 ;
CREATE TABLE IF NOT EXISTS `projects` (
`project_id` smallint(5) unsigned NOT NULL auto_increment,
PRIMARY KEY (`project_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;
Теперь, когда я запускаю запрос ниже, чтобы добавить ограничение, запрос сбой с ошибкой, опубликованной выше. Может ли кто -нибудь помочь?
ALTER TABLE `images` ADD CONSTRAINT `project_id_fk` FOREIGN KEY (`project_id`) REFERENCES `projects` (`project_id`) ON DELETE CASCADE;
Бесконечно благодарен!
Решение
Изменить project_id
столбцы имеют одинаковый размер smallint(6)
(или 5). Вы также должны сделать их обоих подписанными или без подписи.
... с веб -сайта MySQL написано:
Соответствующие столбцы в внешнем ключе и ссылочном ключе должны иметь аналогичные внутренние типы данных внутри InnoDB, чтобы их можно было сравнить без преобразования типа. Размер и признак целочисленных типов должны быть одинаковыми. Длина типов строк не должна быть такой же. Для небинных (символов) строковых столбцов набор символов и сопоставление должны быть одинаковыми.
Другие советы
Я думал, что дата должен соответствовать. Project_id - Smallint (6) в одной столе, а Smallint (5) в другой.
Разве проект не должен быть оба smallint(6)
?