Que signifie l'erreur mysql 1025 (HY000): Erreur lors du changement de nom de './foo' (errorno: 150)?

160

J'ai essayé ceci dans mysql:

mysql> alter table region drop column country_id;

Et j'ai ceci:

ERROR 1025 (HY000): Error on rename of './product/#sql-14ae_81' to
'./product/region' (errno: 150)

Des idées? Trucs de clé étrangère?

Trenton
la source
@skiphoppy - Essayez-vous de donner une prime à une réponse déjà donnée? Est-ce même autorisé? Ou votre cas est-il différent, auquel cas vous devriez démarrer un autre thread?
Rick James
@RickJames Oui, c'est vrai. Cependant, skiphoppy devrait ajouter son commentaire sous la réponse qu'elle a choisie, car le message bouty disparaîtra lorsque la prime sera terminée.
RandomSeed du

Réponses:

240

Vous obtenez généralement cette erreur si vos tables utilisent le moteur InnoDB. Dans ce cas, vous devrez supprimer la clé étrangère, puis modifier la table et supprimer la colonne.

Mais le plus délicat est que vous ne pouvez pas supprimer la clé étrangère en utilisant le nom de la colonne, mais à la place, vous devrez trouver le nom utilisé pour l'indexer. Pour le trouver, exécutez la sélection suivante:

SHOW CREATE TABLE région;

Cela devrait vous montrer le nom de l'index, quelque chose comme ceci:

CONTRAINTEZ TOUTE region_ibfk_1ÉTRANGÈRE ( country_id) RÉFÉRENCES country( id) SUR SUPPRIMER PAS D'ACTION SUR MISE À JOUR PAS D'ACTION

Maintenant, émettez simplement un:

modifier la région de la table déposer la clé étrangère region_ibfk_1;

Et enfin un:

modifier la région de la table drop column country_id;

Et vous êtes prêt à partir!

Jeshurun
la source
Notez que vous pouvez également supprimer la clé étrangère et la colonne dans une requête ALTER TABLE;
Valentin Grégoire
agréable! nous devrions laisser tomber la clé étrangère, tout ira bien! Merci!
Luan D
173

C'est en effet une erreur de clé étrangère, vous pouvez le découvrir en utilisant perror:

shell$ perror 150
MySQL error code 150: Foreign key constraint is incorrectly formed

Pour en savoir plus sur ce qui a échoué, vous pouvez utiliser SHOW ENGINE INNODB STATUSet rechercher la section LATEST FOREIGN KEY ERROR qui contient des détails sur ce qui ne va pas.

Dans votre cas, c'est probablement parce que quelque chose fait référence à la colonne country_id.

Harrison Fisk
la source
2
Encore une fois, une autre erreur MySQL trompeuse a affiché ... Merci.
e2-e4
Dans phpMyAdmin, vous pouvez trouver l'état du moteur dans Storage Engines , InnoDB , InnoDB Status
Maxence
15

Vous pouvez également obtenir cette erreur en essayant de supprimer une clé étrangère non existante. Ainsi, lors de la suppression de clés étrangères, assurez-vous toujours qu'elles existent réellement.

Si la clé étrangère existe et que vous obtenez toujours cette erreur, essayez ce qui suit:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

// Déposez la clé étrangère ici!

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Cela fait toujours l'affaire pour moi :)

Jeroen
la source
1
J'en avais besoin lors du passage à un jeu de caractères différent d'une table, à cause d'une erreur mysql: ERROR 1025 (HY000): Error on rename of './table/#sql-14ae_81' to (errno: 150)
letsjump
7

Exécutez simplement la requête alter table en utilisant «KEY» au lieu de «FOREIGN KEY» dans l'instruction drop. J'espère que cela aidera à résoudre le problème et supprimera la contrainte de clé étrangère et vous pourrez modifier les colonnes de la table et supprimer la table.

ALTER TABLE slide_image_sub DROP  KEY  FK_slide_image_sub;

ici au DROP KEYlieu de DROP FOREIGN KEY,

espérons que cela aidera.

Merci

Muhammad Sohail
la source
4

Je sais, c'est un ancien message, mais c'est le premier résultat sur le moteur de recherche préféré de tout le monde si vous recherchez l'erreur 1025.

Cependant, il existe un "hack" facile pour résoudre ce problème:

Avant d'exécuter vos commandes, vous devez d'abord désactiver la vérification des contraintes de clé étrangère à l'aide de cette commande:

SET FOREIGN_KEY_CHECKS = 0;

Ensuite, vous pouvez exécuter vos commandes.

Une fois que vous avez terminé, n'oubliez pas de réactiver la vérification des contraintes de clé étrangère à l'aide de cette commande:

SET FOREIGN_KEY_CHECKS = 1;

Bonne chance dans votre entreprise.

Baccata
la source
Avait du mal à installer octobercms sur xampp, finalement cela a aidé.
jahackbeth
2

J'ai eu un problème similaire une fois. J'ai supprimé la clé primaire du TABLEAU A, mais lorsque j'essayais de supprimer la colonne de clé étrangère de la table BI, la même erreur ci-dessus a été affichée.

Vous ne pouvez pas supprimer la clé étrangère en utilisant le nom de la colonne et pour contourner cela dans PHPMyAdmin ou avec MySQL, supprimez d'abord la contrainte de clé étrangère avant de renommer ou de supprimer l'attribut.

Joomler
la source
1

Jetez un œil au fichier d'erreur de votre base de données mysql. Selon le bogue # 26305, mon sql ne vous donne pas la cause. Ce bogue existe depuis MySQL 4.1 ;-)

Marabol
la source
J'ai trouvé certaines de vos réponses difficiles à suivre, mais +1 pour un lien vers un rapport de bogue. Apparemment, cela a été corrigé dans MySQL v5.6.6. :)
mwfearnley
1

Si vous utilisez un client tel que MySQL Workbench, cliquez avec le bouton droit de la souris sur la table souhaitée à partir de laquelle une clé étrangère doit être supprimée, puis sélectionnez l'onglet de clé étrangère et supprimez les index.

Ensuite, vous pouvez exécuter la requête comme ceci:

alter table table_name drop foreign_key_col_name;
iltaf khalid
la source
1

Il existe probablement une autre table avec une clé étrangère faisant référence à la clé primaire que vous essayez de modifier.

Pour savoir quelle table a causé l'erreur, vous pouvez exécuter SHOW ENGINE INNODB STATUS, puis consultez la LATEST FOREIGN KEY ERRORsection

Utilisez les catégories SHOW CREATE TABLE pour afficher le nom de la contrainte.

Ce sera très probablement categories_ibfk_1

Utilisez le nom pour supprimer d'abord la clé étrangère, puis la colonne:

ALTER TABLE categories DROP FOREIGN KEY categories_ibfk_1;
ALTER TABLE categories DROP COLUMN assets_id;
youngdero
la source
1

Faire

SET FOREIGN_KEY_CHECKS=0;

avant l'opération peut également faire l'affaire.

Jan Tchärmän
la source
0

Je suppose que problème de contrainte de clé étrangère. Country_id est-il utilisé comme clé étrangère dans une autre table?

Je ne suis pas un gourou de la base de données mais je pense avoir résolu un problème comme celui-ci (où il y avait une contrainte fk) en supprimant le fk, en faisant mes trucs alter table puis en refaisant les trucs fk.

Je serai intéressé d'entendre le résultat - parfois mysql est assez cryptique.

itsmatt
la source
Mysql peut être horrible. Bon généralement, mais ces messages d'erreur, sheesh. Si nous obtenons une explication concise d'une personne du bureau, je la jetterai ici.
Trenton
0

Dans mon cas, j'utilisais MySQL workbench et j'ai rencontré le même problème en déposant une de mes colonnes dans une table. Je n'ai pas trouvé le nom de la clé étrangère. J'ai suivi les étapes suivantes pour résoudre le problème:

  1. Rt. cliquez sur votre schéma et sélectionnez «inspecteur de schéma». Cela vous donne diverses tables, colonnes, index, etc.

  2. Allez dans l'onglet nommé «Index» et recherchez le nom de la colonne sous la colonne nommée «Colonne». Une fois trouvé, vérifiez le nom de la table pour cet enregistrement sous le nom de colonne «Table». S'il correspond au nom de la table souhaitée, notez le nom de la clé étrangère dans la colonne nommée «Nom».

  3. Exécutez maintenant la requête: ALTER table tableNamexx DROP KEY ForeignKeyName;

  4. Vous pouvez maintenant exécuter l'instruction drop qui s'exécutera avec succès.

Jatin Shashoo
la source
0

J'ai eu cette erreur avec MySQL 5.6 mais cela n'avait rien à voir avec les clés étrangères. C'était sur une machine Windows 7 Professionnel agissant comme un serveur sur un petit LAN.

L'application cliente effectuait une opération par lots qui crée une table la remplit de quelques données externes puis exécute une requête se joignant à des tables permanentes puis en supprimant la table "temporaire". Ce lot le fait environ 300 fois et cette routine particulière fonctionnait semaine après semaine depuis plusieurs années lorsque soudainement nous obtenons l'erreur 1025 Impossible de renommer le problème à un moment aléatoire du lot.

Dans mon cas, l'application utilisait 4 instructions DDL un CREATE TABLE suivi de 3 CREATE INDEX, il n'y a pas de clé étrangère. Cependant, seuls 2 des index sont réellement créés et le fichier .frm de la table réelle a été renommé au moment de l'échec.

Ma solution était de se débarrasser des instructions CREATE INDEX séparées et de les créer à l'aide de l'instruction CREATE TABLE. Cela au moment de la rédaction de cet article a résolu le problème pour moi et mon aide à quelqu'un d'autre qui se gratte la tête quand il trouve ce fil.

Chris Millard
la source
-2

averageRatings = FOREACH groupedRatings GENERATE groupe AS movieID, AVG (notes.rating) AS avgRating, COUNT (notes.rating) AS numRatings;

Si vous utilisez une commande comme ci-dessus, vous devez utiliser le groupe en minuscules. Cela peut résoudre votre problème, il a résolu le mien. Au moins dans le script PIG.

Naman Dhameja
la source
Je ne pense pas que ce soit lié au problème, il ou elle rencontre un problème mysql
Zdenek Machek