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