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)
Где моя ошибка? Я не нашел его, когда смотрел на это в течение получаса.
Ответы
Ответ 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
Это также может произойти, если вы не указали правильное имя столбца после ключевого слова "ссылки".