Ошибка MySQL 1005 при создании таблицы с использованием движка InnoDB - PullRequest
2 голосов
/ 18 ноября 2010

Когда я пытаюсь создать таблицу со следующим определением, происходит

CREATE TABLE `demo` (
    `id` INT(11) NOT NULL auto_increment,
    `x_id` INT(11) NOT NULL,
    `y_id` INT(11) NOT NULL,
    `z_id` INT(11) NOT NULL,
    `status` TINYINT unsigned NOT NULL,
    `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY  (`id`),
    CONSTRAINT UNIQUE INDEX(x_id, y_id)
) ENGINE=InnoDB;

и OperationalError:

_mysql_exceptions.OperationalError:
(1005, "Can't create table 'xxx.frm' (errno: -1)")

Это работает, если я удаляю трейлинг ENGINE=InnoDB.

В чем причина этого?

Версия MySQL mysql Ver 14.12 Distrib 5.0.84, for pc-linux-gnu (i686) using readline 5.2

Ответы [ 2 ]

3 голосов
/ 18 ноября 2010

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

Если MySQL сообщает об ошибке 1005 из оператора CREATE TABLE, а сообщение об ошибке ссылается на ошибку 150, таблицасоздание не удалось, потому что ограничение внешнего ключа было сформировано неправильно.Точно так же, если ALTER TABLE завершается ошибкой и ссылается на ошибку 150, это означает, что определение внешнего ключа будет неправильно сформировано для измененной таблицы.Вы можете использовать SHOW ENGINE INNODB STATUS , чтобы отобразить подробное объяснение самой последней ошибки внешнего ключа InnoDB на сервере.

Ограничения внешнего ключа - ошибка 1005

0 голосов
/ 18 ноября 2010

Пожалуйста, попробуйте это:

CREATE TABLE  `demo` (
  `id` int(11) NOT NULL auto_increment,
  `x_id` int(11) NOT NULL,
  `y_id` int(11) NOT NULL,
  `z_id` int(11) NOT NULL,
  `status` tinyint(3) unsigned NOT NULL,
  `created_at` timestamp NOT NULL default CURRENT_TIMESTAMP,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `x_id` (`x_id`,`y_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
...