MySQL ne peut pas ajouter une clé étrangère

J'ai une table dans MySQL InnoDB créé comme ça:

CREATE TABLE `users` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `type` enum('MANUAL','FACEBOOK') NOT NULL DEFAULT 'MANUAL',
  `role` enum('COOK','HOST','ALL') NOT NULL DEFAULT 'ALL',
  `about_me` varchar(1000) DEFAULT NULL,
  `food_preferences` varchar(1000) DEFAULT NULL,
  `cooking_experience` varchar(1000) DEFAULT NULL,
  `with_friend` bit(1) DEFAULT b'0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8

Ensuite, j'ai essayé d'ajouter une table avec une telle déclaration, (pas de clés étrangères ajoutés lors de la création de la table comme eu de problème avec ça):

CREATE TABLE `messages` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `from` bigint(20) NOT NULL,
  `to` bigint(20) NOT NULL,
  `content` varchar(10000) NOT NULL,
  `timestamp_sent` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `timestamp_read` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Avoir les tables créées, j'ai besoin d'ajouter enfin les clés étrangères sur 'from' et 'to' champs de référencement 'users'.'id' champ:

ALTER TABLE `messages` 
  ADD CONSTRAINT `messages_users_fk`
  FOREIGN KEY (`from` , `to` )
  REFERENCES `users` (`id` , `id` )
  ON DELETE SET NULL
  ON UPDATE CASCADE
, ADD INDEX `messages_users_fk_idx` (`from` ASC, `to` ASC)

L'erreur que j'obtiens est:

D'ERREUR: Erreur 1822: impossible d'ajouter la contrainte de clé étrangère. Index manquant pour contrainte "messages_users_fk' dans la table référencée "utilisateurs".

Mais la table 'users' a un PRIMARY index sur 'id'...

Aussi essayé de faire une petite étape et ajouter une clé étrangère juste pour 'from' champ:

ALTER TABLE `messages` 
  ADD CONSTRAINT `messages_users_fk`
  FOREIGN KEY (`from` )
  REFERENCES `users` (`id` )
  ON DELETE SET NULL
  ON UPDATE CASCADE
, ADD INDEX `messages_users_fk_idx` (`from` ASC) ;

L'erreur est légèrement différente:

D'ERREUR: Erreur 1825: impossible d'ajouter la contrainte de clé étrangère sur la table "messages". Incorrect options dans la contrainte de CLÉ ÉTRANGÈRE 'cook4food/messages_users_fk'.

Les types de champs sont les mêmes (bigint(20) NOT NULL) comme il a été suggéré que la cause du problème dans d'autres StackOverflow threads. Mes tableaux ne sont pas partitionnés (manuel MySQL membres de cette limitation pour avoir les contraintes de clé étrangère dans InnoDB). Le 'messages' table stocke pas de lignes actuellement, de sorte que les données stockées ne peut pas être question d'une quelconque manière. Je suis coincé, s'il vous plaît aider.

  • +1 Belle à voir les CREATE TABLE déclarations de jouer avec eux 🙂
InformationsquelleAutor tomek.g1989 | 2013-03-11