Что не так с ограничением внешнего ключа в этой таблице? - PullRequest
12 голосов
/ 06 октября 2011

MySQL 5.1.59 выдает ошибку с этой таблицей создания:

CREATE  TABLE IF NOT EXISTS `genre` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `abv` CHAR(3) CHARACTER SET 'latin1' COLLATE 'latin1_bin' NULL DEFAULT NULL ,
  `name` VARCHAR(80) NOT NULL DEFAULT '' ,
  `parent_id` INT NULL DEFAULT NULL ,
  PRIMARY KEY (`id`) ,
  INDEX `fk_genre_genre1` (`parent_id` ASC) ,
  CONSTRAINT `fk_genre_genre1`
    FOREIGN KEY (`parent_id` )
    REFERENCES `genre` (`id` )
    ON DELETE SET NULL
    ON UPDATE CASCADE)
ENGINE = InnoDB;

, которая была сгенерирована MySQLWorkbench 5.2.33.Сообщение об ошибке:

ОШИБКА 1005 (HY000) в строке __: Невозможно создать таблицу 'mydb.genre' (номер ошибки: 150)

Что не так сэто создать таблицу?

В руководстве написано :

Если MySQL сообщает об ошибке 1005 из оператора CREATE TABLE, и сообщение об ошибке ссылается на ошибку 150, создание таблицы не удалось, поскольку ограничение внешнего ключа было сформировано неправильно.

Также говорится, что ссылки на внешние ключи на одну и ту же таблицу разрешены:

InnoDB поддерживает внешний ключссылки в таблице.В этих случаях «записи дочерней таблицы» действительно относятся к зависимым записям в одной и той же таблице.

Требуемая связь - это неидентифицирующий родительский-дочерний элемент, представляющий иерархию жанров и поджанров.,Жанр не обязательно должен иметь родителя, поэтому parent_id имеет значение null.

Возможно, MySQLWorkbench установит следующее:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

Ответы [ 4 ]

9 голосов
/ 06 октября 2011

Ваш столбец id равен int unsigned;ваш столбец parent_id равен int.Те не совпадают.Решение состоит в том, чтобы изменить parent_id на int unsigned.

Если вы запустите SHOW ENGINE InnoDB STATUS, который я вставил в комментарий, вы увидите это:

11005 17:18:38 Error in foreign key constraint of table test/genre:

    FOREIGN KEY (`parent_id` )
    REFERENCES `genre` (`id` )
    ON DELETE SET NULL
    ON UPDATE CASCADE)
ENGINE = InnoDB:
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
for correct foreign key definition.

Обратите внимание на«типы столбцов в таблице и ссылочной таблице не совпадают» часть.

6 голосов
/ 06 октября 2011

Два поля не одного типа.

CREATE  TABLE IF NOT EXISTS `genre` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,  <<-- unsigned int
  ..
  ..
  `parent_id` INT NULL DEFAULT NULL ,        <<-- signed int
  PRIMARY KEY (`id`) ,                   ***** not the same!!!!
  ....
5 голосов
/ 06 октября 2011

Поля должны быть одного типа.id не подписан, в то время как parent_id не

5 голосов
/ 06 октября 2011

id - это НЕ ПОДПИСАНО , но parent_id не является беззнаковым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...