Ошибка MySql 150 - внешние ключи - PullRequest
17 голосов
/ 05 мая 2009

Когда я выполняю следующие два запроса (я сократил их до абсолютно необходимых):

mysql> CREATE TABLE foo(id INT PRIMARY KEY);
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE bar ( id INT, ref INT, FOREIGN KEY (ref) REFERENCES foo(id)) ENGINE InnoDB;

Я получаю следующую ошибку: ОШИБКА 1005 (HY000): невозможно создать таблицу «./test/bar.frm» (номер ошибки: 150)

Где **** моя ошибка? Я не нашел его, глядя на это полчаса.

Ответы [ 7 ]

30 голосов
/ 05 мая 2009

С FOREIGN KEY Ограничения

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

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

Редактировать: с той же страницы -

Обе таблицы должны быть таблицами InnoDB, и они не должны быть временными таблицами.

11 голосов
/ 22 октября 2013

Вы можете использовать команду SHOW ENGINE INNODB STATUS для получения более конкретной информации об ошибке.

Это даст вам результат с колонкой Status, содержащей много текста.

Найдите раздел с именем LATEST FOREIGN KEY ERROR, который, например, может выглядеть следующим образом:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
190215 11:51:26 Error in foreign key constraint of table `mydb1`.`contacts`:
Create  table `mydb1`.`contacts` with foreign key constraint failed. You have defined a SET NULL condition but column 'domain_id' is defined as NOT NULL in ' FOREIGN KEY (domain_id) REFERENCES domains (id) ON DELETE SET NULL ON UPDATE CASCADE,
    CONSTRAINT contacts_teams_id_fk FOREIGN KEY (team_id) REFERENCES teams (id) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT' near ' ON DELETE SET NULL ON UPDATE CASCADE,
    CONSTRAINT contacts_teams_id_fk FOREIGN KEY (team_id) REFERENCES teams (id) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT'.
4 голосов
/ 14 января 2014

Чтобы создать внешний ключ,

  1. и основной столбец, и столбец ссылок должны иметь одинаковое определение.
  2. двигатель обеих таблиц должен быть InnoDB.

Вы можете изменить механизм таблицы, используя эту команду, пожалуйста, сделайте резервную копию перед выполнением этой команды.

изменить таблицу [имя таблицы] ENGINE = InnoDB;

1 голос
/ 21 ноября 2013

Помимо многих других причин в результате возникает ошибка 150 MySql (при использовании InnoDB). Одной из вероятных причин является неопределенная KEY в операторе create таблицы, содержащей имя столбца, на который ссылается внешний ключ относительная таблица.

Допустим, оператор создания главной таблицы -

CREATE TABLE 'master_table' (<br/> 'id' int(10) NOT NULL AUTO_INCREMENT,<br/> 'record_id' char(10) NOT NULL,<br/> 'name' varchar(50) NOT NULL DEFAULT '',<br/> 'address' varchar(200) NOT NULL DEFAULT '',<br/> PRIMARY KEY ('id')<br/> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

и синтаксис создания для таблицы относительной_таблицы, в которой ограничение внешнего ключа установлено из первичной таблицы -

CREATE TABLE 'relative_table' (<br/> 'id' int(10) NOT NULL AUTO_INCREMENT,<br/> 'salary' int(10) NOT NULL DEFAULT '',<br/> 'grade' char(2) NOT NULL DEFAULT '',<br/> 'record_id' char(10) DEFAULT NULL,<br/> PRIMARY KEY ('id'),<br/> CONSTRAINT 'fk_slave_master' FOREIGN KEY ('record_id') REFERENCES 'master' ('record_id')<br/> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Этот скрипт определенно завершится с ошибкой MySql 150 при использовании InnoDB.

Чтобы решить эту проблему, нам нужно добавить KEY для столбца record_id в таблице master_table и затем ссылку в таблице relative_table, которая будет использоваться в качестве постороннего ключа.

Наконец, оператор create для master_table будет -

CREATE TABLE 'master_table' (<br/> 'id' int(10) NOT NULL AUTO_INCREMENT,<br/> 'record_id' char(10) NOT NULL,<br/> 'name' varchar(50) NOT NULL DEFAULT '',<br/> 'address' varchar(200) NOT NULL DEFAULT '',<br/> PRIMARY KEY ('id'),<br/> <b>KEY 'record_id' ('record_id')</b><br/> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

1 голос
/ 21 января 2013

У меня была такая же проблема, для тех, у кого это тоже:

проверить имя таблицы, на которую ссылается таблица

Я забыл 's' в конце названия таблицы

например, таблица Клиент -> Клиенты

:)

0 голосов
/ 08 сентября 2015

Это также может произойти, если вы не указали правильное имя столбца после ключевого слова "links".

0 голосов
/ 07 августа 2013

У меня была та же самая проблема, и причина была в том, что "сопоставление" столбцов было другим. Один был латиноамериканцем1, а другой - utf8

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