mysql SQL (1215): Cannot add foreign key constraint. Возможные причины и решения

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-таблицу.