Я думаю, вам следует опубликовать точные операторы DDL, которые вы использовали, когда пытались создать эти таблицы и внешний ключ. Внешние ключи между таблицами innodb работают нормально, но есть еще несколько вещей, на которые стоит обратить внимание:
0) Обе таблицы должны быть InnoDB. Это уже подчеркивалось другими авторами, и это, вероятно, является непосредственной причиной вашей проблемы.
1) тип данных столбцов-ссылок (те, которые составляют внешний ключ) и соответствующих столбцов-ссылок должны быть одинаковыми. Например, вы не можете создать ограничение внешнего ключа для столбца INT UNSIGNED для простого столбца INT.
2) если внешний ключ создается как часть таблицы DDL, обязательно поместите определение внешнего ключа в раздел ограничений, то есть ниже всех определений столбцов. Например:
CREATE TABLE parent (
id int unsigned PRIMARY KEY
);
CREATE TABLE child (
parent_id int unsigned
, foreign key (parent_id)
references parent (id)
);
будет работать, но это:
CREATE TABLE child (
parent_id int unsigned
foreign key references parent (id)
);
не будет. Он молча завершится ошибкой, потому что синтаксический анализатор MySQL игнорирует эти типы определений ограничений даже до того, как InnoDB создаст таблицу (глупо, но это так)
3) Должен быть индекс по всем указанным столбцам. Обычно ссылочные столбцы вместе составляют первичный ключ или уникальное ограничение в любом случае, но ваша задача - определить до определения внешнего ключа.
Последнее слово: если вы думаете, что ваш DDL в порядке, но вы все равно получаете сообщение об ошибке, например, так:
ERROR 1005 (HY000): Can't create table 'test.child' (errno: 150)
Warning (Code 150): Create table 'test/child' with foreign key constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns.
Error (Code 1005): Can't create table 'test.child' (errno: 150)
Тогда эти ошибки могут все еще не раскрывать истинную природу ошибки (опять глупо, но это так). Чтобы пролить больше света на него, запустите эту команду сразу после вашей попытки создать внешний ключ:
SHOW ENGINE INNODB STATUS;
Это даст вам кучу информации о статусе, и один раздел там будет выглядеть так:
------------------------
LATEST FOREIGN KEY ERROR
------------------------
120122 11:38:28 Error in foreign key constraint of table test/child:
foreign key (parent_id) references parent (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.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html
for correct foreign key definition.
Как видите, это дает немного больше информации и выявляет истинную проблему, а именно: "типы столбцов в таблице и в ссылочной таблице не соответствуют ограничениям"
Поэтому, пожалуйста, опубликуйте свой фактический DDL, я уверен, что где-то там есть проблема.