Ошибка «Не удается создать таблицу ...» при добавлении FOREIGN KEY - PullRequest
8 голосов
/ 04 мая 2011

Я создал таблицу по сценарию:

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

DROP TABLE IF EXISTS `Table1`;
CREATE TABLE IF NOT EXISTS `Table1` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `parentId` bigint(20) DEFAULT NULL,
  `name` varchar(1024) NOT NULL,
  `description` varchar(16384) NOT NULL DEFAULT '',
  `imageId` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `name` (`name`(255)),
  KEY `parentId` (`parentId`),
  KEY `imageId` (`imageId`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=27 ;


INSERT INTO `Table1` (`id`, `parentId`, `name`, `description`, `imageId`) VALUES
(0, NULL, 'name1', '', NULL),
(12, 0, 'name2', '', NULL);

Затем я пытаюсь добавить внешний ключ:

ALTER TABLE `Table1`
  ADD CONSTRAINT `Table1_ibfk_2` 
    FOREIGN KEY (`parentId`) REFERENCES `Table1` (`id`);

И получите следующую ошибку:

ERROR 1005 (HY000): Can't create table 'sandbox.#sql-c28_4c' (errno: 150)

Что не так?

Я бегу

SHOW ENGINE INNODB STATUS;

Далее следует ОШИБКА ИНОСТРАННЫХ КЛЮЧЕЙ:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
110504 22:06:55 Error in foreign key constraint of table sandbox/#sql-c28_61:

    FOREIGN KEY (`parentId`) REFERENCES `Table1` (`id`):
Cannot resolve table name close to:
 (`id`)
------------

Но это не помогает мне понять, что не так.

Я использую Windows Vista, MySql 5.5.11

UPDATE:

Эта проблема появляется при обновлении с MySql 5.0.67.

Ответы [ 5 ]

4 голосов
/ 05 мая 2011

Фон

ОШИБКА 1005 (HY000): Невозможно создать "песочницу" таблицы. # Sql-c28_4c '(номер ошибки: 150)

Когда вы вводите команду MySQL для ALTER TABLE, она действительно выполняет следующие шаги:

  1. копирует данные из существующей таблицы в новую временную таблицу.
  2. Изменение структурыновая временная таблица
  3. удалить старую таблицу
  4. переименовать временную таблицу в old_table_name.

Проблема
Ваш запрос не выполняетсяв шаге 1.
Обратите внимание, что имена таблиц ссылаются на файлы.
В таблицах linux имена чувствительны к регистру

В Windows они не чувствительны к регистру.

Ответ
Поскольку вы, очевидно, используете linux, регистр таблицы, к которой вы REFERENCES должны быть, должен быть таким же, как в определении этой таблицы, возможно, все строчные.
Вы работаете в Windows, поэтому чувствительность к регистру не должна быть проблемой, может быть, это инструмент, который вы используетенг, у меня тоже были эти проблемы, и использование всех строчных букв для имен таблиц везде решало мои проблемы.

Правильный ответ
Установите системную переменную

lower_case_table_names=1

Чтобы избавиться от этой проблемы.

Обратите внимание , что если у вас lower_case_table_names=2 в Windows, ваш Windoze box превращается в чувствительный к регистру Linux ящик до сих порЧто касается MySQL!

Ссылка
http://dev.mysql.com/doc/refman/5.5/en/identifier-case-sensitivity.html

1 голос
/ 07 октября 2014

В моем случае это было связано с тем, что поле, которое было полем внешнего ключа, имело слишком длинное имя, т.е. foreign key (some_other_table_with_long_name_id). Попробуй что короче. Сообщение об ошибке немного вводит в заблуждение в этом случае.

Также определения полей должны быть одинаковыми (обратите внимание на подтип unsigned).

1 голос
/ 05 мая 2011

Найден обходной путь.

Имя таблицы должно быть в нижнем регистре после REFERENCES.

ALTER TABLE `Table1`
  ADD CONSTRAINT `Table1_ibfk_2` 
    FOREIGN KEY (`parentId`) REFERENCES `table1` (`id`);

Похоже, ошибка в MySql 5.5.11.

FI. phpmyadmin не может добавить внешний ключ.

При экспорте также выдается имя таблицы в нижнем регистре.

MySql 5.1.56 работает как положено.

0 голосов
/ 18 декабря 2014

У меня было такое же исключение:

[PDOException]                                                                                
  SQLSTATE[HY000]: General error: 1005 Can't create table 'service.#sql-4851_c07' (errno: 150) 

Проблема, с которой я столкнулся, была в том, что поле, в котором я хотел сделать внешний ключ, не было пустым :) После того, как я понял, что мне нужно, чтобы оно было пустым, все начало работать.

Конечно, в первоначальном вопросе это не так, я просто хотел, чтобы другие узнали о возможном решении.

0 голосов
/ 04 мая 2011

Я думаю, что ваше объявление вашего внешнего ключа может быть неправильным, в зависимости от того, что вы действительно после. Кажется, это говорит о том, что «parentID» из «Table1» будет ссылаться на поле «id» из «Table1».

ALTER TABLE `Table1`
  ADD CONSTRAINT `Table1_ibfk_2` 
  FOREIGN KEY (`parentId`) REFERENCES `Table1` (`id`);

Может быть, попробовать это:

ALTER TABLE `Table1`
  ADD CONSTRAINT `Table1_ibfk_2` 
  FOREIGN KEY (`id`) REFERENCES Parent(`parentId`);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...