Общее сообщение MySQL «errno 150» « означает, что ограничение внешнего ключа сформировано неправильно ». Как вы, вероятно, уже знаете, читаете ли вы эту страницу, общее сообщение об ошибке «errno: 150» действительно бесполезно. Тем не менее:
Вы можете получить сообщение об ошибке фактическое , запустив SHOW ENGINE INNODB STATUS;
, а затем найдя LATEST FOREIGN KEY ERROR
в выводе.
Например, эта попытка создать ограничение внешнего ключа:
CREATE TABLE t1
(id INTEGER);
CREATE TABLE t2
(t1_id INTEGER,
CONSTRAINT FOREIGN KEY (t1_id) REFERENCES t1 (id));
завершается с ошибкой Can't create table 'test.t2' (errno: 150)
. Это никому не говорит ничего полезного, кроме того, что это проблема внешнего ключа. Но запустите SHOW ENGINE INNODB STATUS;
, и он скажет:
------------------------
LATEST FOREIGN KEY ERROR
------------------------
130811 23:36:38 Error in foreign key constraint of table test/t2:
FOREIGN KEY (t1_id) REFERENCES t1 (id)):
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.
Он говорит, что проблема в том, что он не может найти индекс. SHOW INDEX FROM t1
показывает, что для таблицы t1
вообще нет никаких индексов. Исправьте это, скажем, определив первичный ключ на t1
, и ограничение внешнего ключа будет успешно создано.