8
votes

MySQL 5.5 La contrainte de clé étrangère échoue lorsque la clé étrangère existe

Il suffit d'installer MySQL 5.5 sur Mac OS X 10.6 et j'ai un problème étrange sur de nombreuses tables. Vous trouverez ci-dessous un exemple. L'insertion d'une ligne échoue avec une contrainte de clé étrangère lorsqu'elle ne devrait pas. La clé étrangère utilisée des références existe. Toutes idées?

------------------------
LATEST FOREIGN KEY ERROR
------------------------
110406  9:55:49 Transaction:
TRANSACTION CA3B, ACTIVE 0 sec, OS thread id 4494462976 inserting
mysql tables in use 1, locked 1
1 lock struct(s), heap size 376, 0 row lock(s)
MySQL thread id 25, query id 50720 localhost root update
INSERT INTO Language_Phrases (Language_Id, Label, Phrase) VALUES (1, 'exampleLabel', 'Some phrase')
Foreign key constraint fails for table `dev`.`language_phrases`:
,
  CONSTRAINT `FK8B4876F3AEC1DBE9` FOREIGN KEY (`Language_Id`) REFERENCES `Language` (`Id`)
Trying to add to index `PRIMARY` tuple:
DATA TUPLE: 5 fields;
 0: len 4; hex 80000001; asc     ;;
 1: len 17; hex 747970654d69736d617463682e79656172; asc exampleLabel;;
 2: len 6; hex 00000000ca3b; asc      ;;;
 3: len 7; hex 00000000000000; asc        ;;
 4: len 21; hex 59656172206d7573742062652061206e756d626572; asc Some phrase;;

But the parent table `dev`.`Language`
or its .ibd file does not currently exist!


4 commentaires

Y a-t-il un lien vers où ce bogue est mentionné? J'ai le même problème (mysql5.5 et OSX10.6) et j'aimerais en savoir plus dessus.


Je n'ai pas les liens utiles, nous les avons trouvés dans des forums MySQL et il y avait aussi un rapport de bogue.


Avait exactement le même problème, merci d'avoir posté ces gars. Cela conduis mon fou depuis quelques jours.


@Georgevelez - utilisiez-vous le dernier MySQL?


6 Réponses :


0
votes

Vérifiez les attributs de type numérique de language_phrases (language_id) et langue ( ID )

Les deux devraient être soit non signé Zerofill ou signés


4 commentaires

Comment vérifier ou définir s'ils sont signés ou non signés?


Ils sont tous les deux int (11) selon décrivent


Allez sur phpmyadmin et vérifier les deux..may Soyez un espace dans le nom d'attribut ??


Ils sont pareils, il s'avère que ceci est un bug massif. Les dernières versions MySQL sont cassées sous Mac OS X 10.6.



0
votes

* mysql> insérer dans des valeurs de langage_phrase (language_id, étiquette, phrase) (1, "examplélélabel", "une certaine phrase"); Erreur 1452 (23000): Impossible d'ajouter ou de mettre à jour une ligne d'enfant: ... *

Vous essayez d'insérer 1 comme langage_id, mais la langue de table a la propriété auto_incrènement = 3 . Dans ce cas, vous devriez utiliser 3 ou plus.


3 commentaires

J'ai donné la sortie de la langue, qui comprend 2 rangées (c'est la raison pour laquelle Auto_Increment = 3)


Essayez de recréer le FK; Il y a la même erreur - forums.mysql.com/read. PHP? 135,407929 407929 # MSG-407929


Dresser et recréer la clé étrangère ne corrige pas l'erreur. Mais le fil intéressant. Il apparaît que les 3 dernières versions de MySQL sont assez cassées, au moins sur Mac OS X 10.6. Détail à MySQL 5.5.8 a travaillé pour nous aussi bien que ce fil ...



9
votes

Cela semble être un bogue introduit depuis MySQL 5.5.9 sur Mac OS X: http://bugs.mysql.com/bug.php?id=60309

Il est marqué comme fixé en 5.5.13 (publié le 31 mai) et mentionné dans les notes de version: http://dev.mysql.com/doc/refman/5.5/ FR / News-5-5-13.html

Alternativement, il existe une solution répertoriée dans le rapport de bogue que j'ai vérifié sur 5.5.10 et reproduit ci-dessous: xxx


2 commentaires

Merci! Je vais vérifier la dernière version de MySQL!


Ce problème se recadré à nouveau après la mise à niveau vers OS X Lion. La solution que j'ai référencée ci-dessus ne semble pas fonctionner cette fois-ci, cependant, j'ai été obligée de mettre à niveau MySQL. Version 5.5.14 Installé via homebrew Fonctionne un traitement!



1
votes

Pas surprenant IMHO. J'ai trouvé de nombreux insectes dans MySQL. Par exemple, exécutez des requêtes avec les clauses telles que "où certains_tinyint_column = 0" ne produiraient aucune donnée lorsqu'il devrait, mais réécrire la clause comme "où (non quelque part_inyint_column = 1)" produit des résultats. Après quelques recherches, j'ai constaté que c'était un bug censé avoir été corrigé, mais dans la libération que j'utilisais, le bogue était toujours là.

Conclusion: Quand quelque chose ne fait absolument aucun sens dans MySQL, je trouve généralement sa sécurité pour supposer que c'est un bogue et commencer à rechercher des informations sur ces lignes.


0 commentaires

0
votes

J'ai eu la même erreur aujourd'hui. Dans mon cas, j'ai utilisé un script pour recréer quelques tables avec tous leurs dossiers.

En fait, j'ai réalisé que le type "moteur" était différent entre mes tables: une était myisam et le second (le second La référence du FK) était innodub. J'ai modifié toutes mes tables à innoDB et tout fonctionne bien. P>

Ce script générera un fichier de script de mise à jour ( référence ) p> xxx pré>

Vous devez supprimer la première ligne dans" alter_innodb.sql " , ligne contenant le texte "sql_statifs". p>

Après cela, vous pouvez exécuter le script de votre base de données pour corriger cette erreur: p>

mysql -u DB_USER -pDB_PASSWORD --default-character-set=utf8  DATABASE_NAME < ./ alter_InnoDb.sql


0 commentaires

1
votes

Je faisais également face au même problème et je n'ai trouvé aucune solution qui résout mon problème. Ce problème peut donc se produire en raison de nombreuses raisons. J'essaie simplement de mettre autant de ces raisons et de ces solutions à un endroit et de mettre le correctif qui m'a aidé à résoudre ce problème. J'espère que cela aidera quelqu'un à l'avenir.

1) fourni par Penfold - Sensibilité à l'affaire des noms de table
2) Mismachatch du moteur dans la table des parents et des enfants
3) Mismatch Charset dans la table des parents et des enfants
4) Parent (ID) et enfant (PATENT_ID: Les deux doivent avoir exactement les mêmes types de données (également signés / non signés)
5) InnoDB Lost Table mais Table existe - Veuillez trouver une solution ici < / p>

Query SQL (Afficher le moteur Innodb Statut) donne cette erreur (son fichier .ibd n'existe pas actuellement!) BlockQuote

6) Peu de versions plus anciennes de MySQL ont ce bogue. Bug # 60196 , BOGUE # 60309
7) Cela fonctionne pour moi (si tout ce qui précède semble bien, vous avez probablement besoin de cela) - laissez tomber la clé étrangère de la table enfant et ajoutez à nouveau une contrainte. Si cela échoue également, supprimez la table des parents et créez-la à nouveau, avant de laisser tomber la clé étrangère de toutes les tables d'enfant. Celui-ci est la dernière chose possible.
En outre lire: https: //dev.mysql .Com / Doc / Refman / 8.0 / fr / Server-System-variables.html # sysvar_lower_case_table_names


0 commentaires