Довольно часто при попытке создать внешний ключ MySQL вываливает невнятные errno: xxx. Их описания в большинстве случаев ничего не дают, даже запутывают ещё больше.
Реальных причин может быть несколько:
Тип таблицы, на которую указывает ключ не InnoDB, SolidDB или PBXT.
С одной из сторон ключа нет индекса (да, создавать его надо руками).
С одной из сторон ключа нет столбца с указанными именем.
Неверное описание отношения, например ON DELETE SET NULL для столбца NOT NULL.
Ограничение с таким именем уже есть.
Несовпадение типов полей, связываемых отношением. Например, нельзя использовать с одной стороны int(10) unsigned, а с другой int(11) или bigint.
Нарушение целостности данных (integrity violation), т.е. когда ссылающийся id прописан, а в связываемой таблице его нет.
Пожалуй, пятый случай самый сложный в отладке, поэтому лучше взять за правило именовать ключи, индексы и ограничения уникально.