Подтвердить что ты не робот

MySql Ошибка 150 - Внешние ключи

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

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;

Я получаю следующую ошибку:   ERROR 1005 (HY000): невозможно создать таблицу. /test/bar.frm '(errno: 150)

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

4b9b3361

Ответ 1

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

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

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

Изменить: с той же страницы -

Обе таблицы должны быть таблицами InnoDB, и они не должны быть ВРЕМЕННЫМИ таблицами.

Ответ 2

Вы можете использовать команду SHOW ENGINE INNODB STATUS

Ответ 3

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

  • как основной столбец, так и ссылочный столбец должны иметь одинаковое определение.
  • Оба движка таблиц должны быть InnoDB.

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

alter table [имя таблицы] ENGINE = InnoDB;

Ответ 4

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

проверить имя таблицы ссылочной таблицы

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

eg table Клиент → Клиенты

:)

Ответ 5

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

Скажем, инструкция create главной таблицы -

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

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

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

Этот script, безусловно, закончится MySql Error 150 при использовании InnoDB.

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

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

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

Ответ 6

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

Ответ 7

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