Я создал таблицу скриптом:Ошибка "Не удается создать таблицу ..." при добавлении FOREIGN KEY
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;
Там Последняя FOREIGN KEY ERROR следующим образом:
------------------------
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.
Извините, но ваш правильный ответ не подходит :) Я использую lower_case_table_names = 0, более того, я хочу, чтобы исправлено http://bugs.mysql.com/bug.php?id=55222. И более того: все отлично работает с MySql 5.1.56. Будет понижаться. В именах файлов Windows не учитываются регистры, но есть внутренние таблицы mysql, в которых хранятся другие имена таблиц, и их можно обрабатывать с учетом регистра в зависимости от значения lower_case_table_names – sergtk
@sergdev, из документов: имена таблиц и баз данных хранятся на диске, используя буквенный регистр, указанный в инструкции CREATE TABLE или CREATE DATABASE. Сравнение имен чувствительно к регистру. Вы не должны устанавливать эту переменную в 0, если вы используете MySQL в системе с именами без учета регистра (например, Windows или Mac OS X). Если вы вынудите эту переменную к 0 с --lower-case-table-names = 0 в файловой системе без учета регистра и получите доступ к табличным именам MyISAM с использованием разных буквенных букв, может возникнуть повреждение индекса. ** ** выглядит как ваша настройка: ** ' lower_case_table_names = 0' ** - проблема ** – Johan