Ошибка при создании внешнего ключа - PullRequest
0 голосов
/ 05 января 2010

Я получаю эту ошибку при попытке добавить ограничение внешнего ключа:

#1005 - Can't create table './testtable/#sql-595_146.frm' (errno: 150)

Мне нужно сделать ON DELETE CASCADE для всех изображений, которые имеют идентификатор проекта, когда этот проект удаляется. Моя упрощенная структура таблицы выглядит следующим образом:

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;

Спасибо за миллион!

Ответы [ 3 ]

1 голос
/ 05 января 2010

Я думал, что тип данных должен соответствовать. project_id это smallint (6) в одной таблице и smallint (5) в другой.

1 голос
/ 05 января 2010

Не должны ли оба значения project_id быть smallint(6)?

1 голос
/ 05 января 2010

Измените столбцы project_id на одинаковый размер smallint(6) (или 5). Вы также должны сделать их подписанными или неподписанными.

... с сайта mysql написано:

Соответствующие столбцы во внешнем ключе и ссылочном ключе должны иметь одинаковые внутренние типы данных внутри InnoDB, чтобы их можно было сравнивать без преобразования типов. Размер и знак целочисленных типов должны быть одинаковыми. Длина типов строк не обязательно должна быть одинаковой. Для недвоичных (символьных) строковых столбцов набор символов и сопоставление должны быть одинаковыми.

...