MySQL Создание таблиц с использованием внешних ключей с ошибкой: 150 - PullRequest
95 голосов
/ 22 сентября 2009

Я пытаюсь создать таблицу в MySQL с двумя внешними ключами, которые ссылаются на первичные ключи в 2 других таблицах, но я получаю ошибку errno: 150, и она не будет создавать таблицу.

Вот SQL для всех 3 таблиц:

CREATE TABLE role_groups (
  `role_group_id` int(11) NOT NULL `AUTO_INCREMENT`,
  `name` varchar(20),
  `description` varchar(200),
  PRIMARY KEY (`role_group_id`)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS `roles` (
  `role_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50),
  `description` varchar(200),
  PRIMARY KEY (`role_id`)
) ENGINE=InnoDB;

create table role_map (
  `role_map_id` int not null `auto_increment`,
  `role_id` int not null,
  `role_group_id` int not null,
  primary key(`role_map_id`),
  foreign key(`role_id`) references roles(`role_id`),
  foreign key(`role_group_id`) references role_groups(`role_group_id`)
) engine=InnoDB;

Любая помощь будет принята с благодарностью.

Ответы [ 19 ]

1 голос
/ 28 марта 2013

Обычно это происходит при попытке загрузить исходный файл в существующую базу данных. Сначала удалите все таблицы (или саму БД). А затем исходный файл с SET foreign_key_checks = 0; в начале и SET foreign_key_checks = 1; в конце.

1 голос
/ 24 августа 2015

MySQL Workbench 6.3 для Mac OS.

Проблема: ошибка 150 в таблице X при попытке выполнить форвард-инжиниринг на диаграмме БД, 20 из 21 успешно выполнено, 1 - неудачно Если FK таблицы X были удалены, ошибка переносилась в другую таблицу, которая ранее не вызывала ошибок.

Изменен механизм всех таблиц на myISAM, и он работал просто отлично.

enter image description here

1 голос
/ 02 августа 2014

Я нашел другую причину, по которой это не удается ... имена таблиц с учетом регистра.

Для этого определения таблицы

CREATE TABLE user (
  userId int PRIMARY KEY AUTO_INCREMENT,
  username varchar(30) NOT NULL
) ENGINE=InnoDB;

Это определение таблицы работает

CREATE TABLE product (
  id int PRIMARY KEY AUTO_INCREMENT,
  userId int,
  FOREIGN KEY fkProductUser1(userId) REFERENCES **u**ser(userId)
) ENGINE=InnoDB;

тогда как этот провал

CREATE TABLE product (
  id int PRIMARY KEY AUTO_INCREMENT,
  userId int,
  FOREIGN KEY fkProductUser1(userId) REFERENCES User(userId)
) ENGINE=InnoDB;

Тот факт, что он работал в Windows и не работал в Unix, занял у меня пару часов, чтобы понять. Надеюсь, что это поможет кому-то еще.

0 голосов
/ 30 июня 2018

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

0 голосов
/ 14 февраля 2018

(примечания слишком велики для комментария)

Нет необходимости в AUTO_INCREMENT id в таблице сопоставления; избавиться от этого.

Измените PRIMARY KEY на (role_id, role_group_id) (в любом порядке). Это ускорит доступ.

Поскольку вы, вероятно, хотите отобразить оба направления, также добавьте INDEX с этими двумя столбцами в обратном порядке. (Нет необходимости делать это UNIQUE.)

Дополнительные советы: http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta

0 голосов
/ 22 января 2013

Также стоит проверить, что вы случайно не работаете с неверной базой данных. Эта ошибка произойдет, если сторонняя таблица не существует. Почему MySQL должен быть настолько загадочным?

0 голосов
/ 14 мая 2015

Если ограничение внешнего ключа основано на типе varchar, то в дополнение к списку , предоставленному marv-el, целевой столбец должен иметь уникальное ограничение.

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

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

Кроме того, как уже упоминал @Jon - определения полей должны быть одинаковыми (обратите внимание на подтип unsigned).

0 голосов
/ 04 июня 2013

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

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