web-dev-qa-db-fra.com

Qu'est-ce que l'erreur mysql 1025 (HY000): Erreur lors du changement de nom de './foo' (errno: 150)?

J'ai essayé ceci dans mysql:

mysql> alter table region drop column country_id;

Et j'ai eu ceci:

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

Des idées? Des affaires de clés étrangères?

154
Trenton

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

Mais la difficulté réside dans le fait que vous ne pouvez pas supprimer la clé étrangère en utilisant le nom de la colonne, mais que vous devez plutôt trouver le nom utilisé pour l'indexer. Pour le trouver, lancez la sélection suivante:

SHOW CREATE TABLE région;

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

CONTRAINTE region_ibfk_1 ÉTRANGER KEY (country_id) RÉFÉRENCES country (id) ON SUPPRIMER NO ACTION SUR MISE À JOUR NO ACTION

Maintenant simplement émettre un:

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

Et enfin un:

modifier la colonne de dépôt de la région de la table country_id;

Et vous êtes prêt à partir!

232
Jeshurun

C'est en effet une erreur de clé étrangère, vous pouvez le savoir 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 STATUS et rechercher la section LATEST FOREIGN ERREUR qui contient des détails sur ce qui ne va pas. 

Dans votre cas, il est fort probable que quelque chose fasse référence à la colonne country_id.

173
Harrison Fisk

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 qu'elles existent toujours.

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';

// Laisse 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 le tour pour moi :)

14
Jeroen

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. Vous pourrez modifier les colonnes et supprimer le tableau.

ALTER TABLE slide_image_sub DROP  KEY  FK_slide_image_sub;

ici dans DROP KEY au lieu de DROP FOREIGN KEY,

j'espère que ça va aider.

Merci

7
Sohail

Je sais, c’est un vieux billet, mais c’est le premier coup sur le moteur de recherche préféré de tous, si vous cherchez 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 d'activer la vérification des contraintes de la clé étrangère à l'aide de la commande suivante:

SET FOREIGN_KEY_CHECKS = 1;

Bonne chance dans votre entreprise.

2
Baccata

J'ai eu un problème similaire une fois. J'ai supprimé la clé primaire de la TABLE A, mais lorsque j'essayais de supprimer la colonne de clé étrangère de la table B, la même erreur s'affichait.

Vous ne pouvez pas supprimer la clé étrangère en utilisant le nom de la colonne. Pour ignorer cela dans PHPMyAdmin ou avec MySQL, commencez par supprimer la contrainte de clé étrangère avant de renommer ou de supprimer l'attribut.

2
Joomler

Faire

SET FOREIGN_KEY_CHECKS=0;

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

1
Jan Tchärmän

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 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;
1
iltaf khalid

Il existe probablement une autre table avec une clé étrangère référençant la clé primaire que vous essayez de modifier.

Pour savoir quelle table a provoqué l'erreur, vous pouvez exécuter SHOW ENGINE INNODBSTATUS, puis consultez la section LATEST FOREIGN KEY ERROR.

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

Il s'agira très probablement de categories_ibfk_1

Utilisez le nom pour supprimer la clé étrangère en premier, puis la colonne:

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

Jetez un coup d'oeil dans le fichier d'erreur de votre base de données mysql. Selon Bug n ° 26305 mon sql ne vous en donne pas la cause. Ce bogue existe depuis MySQL 4.1 ;-)

1
marabol

Je suppose que le 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 mon travail dans la table de modification, puis en le refaisant.

Je serais intéressé d’entendre le résultat - parfois, mysql est assez crypté.

0
itsmatt

J'ai eu cette erreur avec MySQL 5.6 mais cela n'avait rien à voir avec les clés étrangères. C'était sur un ordinateur Windows 7 Professionnel agissant en tant que serveur sur un petit réseau local. 

L'application client effectuait une opération de traitement par lots qui crée une table qui la remplit avec des données externes, puis exécute une requête joignant des tables permanentes, puis supprimant la table "temporaire". Ce lot effectue cela environ 300 fois et cette routine particulière a été exécutée semaine après semaine pendant plusieurs années lorsque, soudainement, nous rencontrons le problème Erreur 1025 Impossible de renommer le problème à un point aléatoire du lot.

Dans mon cas, l'application utilisait 4 instructions DDL CREATE TABLE suivies 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 a été renommé, au moment de l'échec.

Ma solution consistait à supprimer les instructions CREATE INDEX distinctes et à les créer à l'aide de l'instruction CREATE TABLE. Cela au moment de la rédaction a résolu le problème pour moi et mon aide, quelqu'un d'autre se gratter la tête quand ils trouvent ce fil. 

0
Chris Millard

Dans mon cas, j'utilisais MySQL Workbench et je faisais face au même problème en supprimant l'une de mes colonnes dans un tableau. Je n'ai pas pu trouver 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 divers tableaux, colonnes, index, etc.

  2. Allez dans l'onglet "Index" et cherchez le nom de la colonne sous la colonne "Colonne". Une fois trouvé, cochez le nom de la table pour cet enregistrement sous le nom de colonne 'Table'. Si cela correspond au nom de la table souhaitée, notez le nom de la clé étrangère dans la colonne nommée 'Nom'.

  3. Maintenant, exécutez la requête: ALTER table tableNamexx DROP KEY foreignKeyName;

  4. Maintenant, vous pouvez exécuter l'instruction drop qui doit être exécutée avec succès.

0
Jatin Shashoo