mysql SQL (1215): Cannot add foreign key constraint. Возможные причины и решения
Primary tabs
Forums:
SQL (1215): Cannot add foreign key constraint
Рассмотрим возможные причины:
1) Противоречия в определении операций
В частности убедитесь что нет противоречия при определении операции для внешних ключей, например:
- Противоречие внутри определения самой таблицы (null/not null):
CREATE TABLE `car_arr_types` ( `car_group_id` INTEGER NOT NULL, `car_timing_id` INTEGER NOT NULL, `car_type_id` INTEGER NOT NULL, PRIMARY KEY (`car_group_id`,`car_timing_id`,`car_type_id`), CONSTRAINT `car_a_fk_17d9f0` FOREIGN KEY (`car_type_id`) REFERENCES `cars_types` (`id`) ON DELETE SET NULL # противоречие с требованием NOT NULL, указанном выше ) ENGINE=InnoDB
- Противоречия в определении типов столбцов - ссылающегося и того, на который ссылаются, например, у вас есть таблица:
CREATE TABLE `categories` ( `id` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB ;
И вы хотите создать таблицу с внешним ключом, который будет ссылаться на categories.id, если написать запрос создания так:
CREATE TABLE subCategory ( `id` smallint(5) NOT NULL AUTO_INCREMENT COMMENT 'Id подкатегории', `name` VARCHAR(50) NOT NULL COMMENT 'Название подкатегории', `category_id` smallint(5) COMMENT 'Id категории (ссылка на категорию)', PRIMARY KEY (`id`), FOREIGN KEY (`category_id`) REFERENCES categories(`id`) ) ENGINE=InnoDB ;
-- то это работать не будет так как получается что сам categories.id определен как:
SMALLINT(5) UNSIGNED
-- не только "смолл инт", но ещё и беззнаковый (UNSIGNED), а вот внешний ключ в новой таблице хоть и того же типа, но беззнаковость не указана, это и приводит к ошибке, т.е. исправленный запрос на создание будет выглядеть так:
CREATE TABLE subCategory ( `id` smallint(5) NOT NULL AUTO_INCREMENT COMMENT 'Id подкатегории', `name` VARCHAR(50) NOT NULL COMMENT 'Название подкатегории', `category_id` smallint(5) UNSIGNED COMMENT 'Id категории (ссылка на категорию)', PRIMARY KEY (`id`), FOREIGN KEY (`category_id`) REFERENCES categories(`id`) ) ENGINE=InnoDB ;
2) Ваш движок не поддерживает внешние ключи
Убедитесь, что ваш движок поддерживает внешние ключи, быть может вы пытается назначить ключ из InnoDB таблицы в MyISAM-таблицу.
- Log in to post comments
- 4387 reads