MySQL ОШИБКА: 1005 Не удается создать таблицу 'myTable' (номер ошибки: 150) - PullRequest
2 голосов
/ 29 февраля 2012

Я прочитал несколько сообщений об этой ошибке, но ни одному из решений не удалось решить проблему (при условии, что я их правильно пробовал).

Этот код вызывает ошибку:

CREATE TABLE season
(
  id          smallint unsigned NOT NULL auto_increment,
  title       varchar(25) NOT NULL,

  PRIMARY KEY (id)
);

CREATE INDEX seasonId ON season(id);

DROP TABLE IF EXISTS event;
CREATE TABLE event
(
  id           smallint unsigned NOT NULL auto_increment,
  title        varchar(255) NOT NULL,
  season_id    smallint NOT NULL,

  PRIMARY KEY (id),
  FOREIGN KEY (season_id) REFERENCES season(id)
  ON UPDATE RESTRICT ON DELETE RESTRICT
);

Так что в соответствии с ошибкой существует проблема с моим объявлением внешнего ключа.Однако я уже запустил этот код на машине без проблем, и он отлично работал и на моей Linux-машине (в настоящее время я работаю под Windows 7).

Вот вывод SHOW ENGINE INNODB STATUS:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
120229 17:43:28 Error in foreign key constraint of table fcrcontent/event:
FOREIGN KEY (season_id) REFERENCES season(id)
  ON UPDATE RESTRICT ON DELETE RESTRICT
):
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.5/en/innodb-foreign-key-constraints.html
for correct foreign key definition.

Я также пытался запустить свой скрипт на новой базе данных, но безуспешно.

Вот вывод show create table season:

| season | CREATE TABLE `season` (
  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(25) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `seasonId` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

Ответы [ 4 ]

4 голосов
/ 29 февраля 2012

Так как season.id не подписан, event.season_id также должен быть без знака:

CREATE TABLE event
(
  id           smallint unsigned NOT NULL auto_increment,
  title        varchar(255) NOT NULL,
  season_id    smallint unsigned NOT NULL,

  PRIMARY KEY (id),
  FOREIGN KEY (season_id) REFERENCES season(id)
  ON UPDATE RESTRICT ON DELETE RESTRICT
);
2 голосов
/ 15 ноября 2012

Для проблем с "Не могу создать таблицу 'X' (номер ошибки: 150)", проверьте эту страницу .

Самое важное, на что он указывает, - это войти на сервер MySQL через командную строку сразу после того, как это произойдет, и набрать:

ПОКАЗАТЬ СТАТУС ДВИГАТЕЛЯ INNODB;

Это извергает все виды дерьма, но самое главное, вы должны увидеть раздел под названием «ПОСЛЕДНЯЯ ОШИБКА ИНОСТРАННЫХ КЛЮЧЕЙ», где вы увидите реальную проблему, говоря что-то вроде этого:


ПОСЛЕДНЯЯ ОШИБКА ИНОСТРАННОГО КЛЮЧА

121114 16:22:57 Ошибка ограничения внешнего ключа таблицы dgweb / company: в ссылочной таблице нет индекса, который бы содержал столбцы в качестве первых столбцов,или типы данных в ссылочной таблице не совпадают с типами в таблице.Ограничение:, CONSTRAINT "fk_company_wf_reporting_info" FOREIGN KEY ("wf_reporting_info") ССЫЛКИ> "wf_reporting_info" ("wf_reporting_info_id") Индекс во внешнем ключе в таблице - это "fk *company_wf_report_info__ref_report_info__ref_report_info"1019 *

Тогда ты поймешь, что, черт возьми, не так: -).

1 голос
/ 29 февраля 2012

Поскольку вы не показали вывод show create table season, я не могу быть уверен, в чем ваша проблема.

Однако, документы MySQL имеют контрольный список:

  • Соответствующие столбцы [...] должны иметь схожие внутренние типы данных. [..] Размер и знак целочисленных типов должны быть одинаковыми

  • InnoDB требует индексов для внешних ключей и ссылочных ключей [...].

  • [...] в ссылочной таблице должен быть индекс, в котором указанные столбцы перечислены как первые столбцы в том же порядке.

(выделено мое).

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

0 голосов
/ 05 марта 2012

This:

`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,

Должен быть точно такого же типа, как этот:

season_id    smallint NOT NULL,

, поэтому измените его на

smallint(5)
...