Обновление: я должен был быть слепым:
Причина, по которой ваша таблица не работает, заключается в том, что ваш ключ "rev_page_id" находится в неправильном порядке (innodb требует, чтобы ключ был в том же порядке, что и внешний ключ:
CREATE TABLE `revision` (
`rev_id` int(10) unsigned NOT NULL auto_increment,
....
`rev_parent_id` int(10) unsigned default NULL,
PRIMARY KEY (`rev_id`),
-- wrong:
-- UNIQUE KEY `rev_page_id` (`rev_page`,`rev_id`),
-- better:
UNIQUE KEY `rev_page_id` (`rev_id`, `rev_page`),
....
Пожалуйста, игнорируйте предложение ниже:
Попробуйте
SHOW ENGINE INNODB STATUS
Ищите что-нибудь. как "LAST INNODB FOREIGN KEY ERROR"
К сожалению, сообщение об ошибке в большинстве случаев не очень интуитивно понятно. Поскольку вы сказали, что типы все одинаковые, я думаю, это может быть следующая ошибка:
- Имя FK уже существует (имена FK должны быть уникальными для всей базы данных). Чтобы быть правдой, они должны быть уникальными для всего экземпляра mysql, но внутренне innodb добавляет имя базы данных к имени внешнего ключа (FK_approval_user внутренне называется yourdbname # FK_approval_user)
Обновление:
Похоже, вам не хватает ключа для "FK_approval_revision"
Должно выглядеть так:
CREATE TABLE `approval` (
`rev_id` int(10) UNSIGNED NOT NULL,
`rev_page` int(10) UNSIGNED NOT NULL,
`user_id` int(10) UNSIGNED NOT NULL,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`rev_id`,`rev_page`,`user_id`),
KEY `FK_approval_user` (`user_id`),
KEY `FK_approval_revision` (`rev_id`, `rev_page`),
CONSTRAINT `FK_approval_revision` FOREIGN KEY (`rev_id`, `rev_page`) REFERENCES `revision` (`rev_id`, `rev_page`),
CONSTRAINT `FK_approval_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;