2009-11-19 7 views
2

Un de mes clients a récemment formaté sa machine et a réinstallé MySQL Server et mon application. Il s'est plaint que la suppression des enregistrements de la table principale n'affecte pas les tables enfant. Je lui ai demandé d'envoyer la sauvegarde de la base de données. Lorsque j'ai restauré la base de données, j'ai trouvé que le moteur de table est passé à MyISAM alors qu'ils étaient définis sur InnoDB.Problème de clé étrangère MySQL

J'ai supprimé les enregistrements de la table enfant qui étaient absents de la table primaire. Après ceci quand je ne suis pas en train de redéfinir l'index de clé étrangère, il affiche erreur: "Erreur de clé étrangère échouée Erreur 1005" et parfois erreur: 150.

J'ai vérifié deux fois les lignes qui peuvent être laissées dans le table primaire ou dans la table des enfants, mais rien ne semble fonctionner.

La table principale a deux colonnes qui forment une clé primaire. Les colonnes sont: BillNo, BillDate.

Veuillez nous aider.

Répondre

4

Ceci est un piège MySQL largement connu; J'ai moi-même rencontré ce problème plusieurs fois. Ils ont probablement eu un problème avec InnoDB, et ont restauré leur base de données à partir de sauvegardes. Comme InnoDB ne fonctionnait pas, il revenait au moteur de stockage MyISAM qui ne supporte pas les contraintes d'intégrité (comme les clés étrangères). Fondamentalement, le problème est que, si le moteur InnoDB ne démarre pas pour une raison quelconque (généralement des problèmes de configuration), alors MySQL retombe silencieusement sur le moteur MyISAM. Même si votre déclaration dit:

CREATE TABLE() ENGINE=InnoDB 

alors, si InnoDB n'est pas actif, MySQL va créer avec bonheur une table MyISAM sans même vous prévenir. Au revoir l'intégrité des données! :) Vous pouvez exécuter SHOW ENGINES pour voir quels moteurs sont actifs. Voir this MySQL bug report pour plus de détails.

1
  1. Vérifiez que vous utilisez le moteur InnoDB pour les deux tables.

  2. Vérifiez que les deux champs sont du même type et qu'ils sont indexés.

De http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html:

If you re-create a table that was dropped, it must have a definition that conforms to the foreign key constraints referencing it. It must have the right column names and types, and it must have indexes on the referenced keys, as stated earlier. If these are not satisfied, MySQL returns error number 1005 and refers to error 150 in the error message.

Questions connexes