Вопрос

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

#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)?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top