MySQL Suppression de certaines clés étrangères

199

J'ai une table dont la clé primaire est utilisée dans plusieurs autres tables et a plusieurs clés étrangères vers d'autres tables.

CREATE TABLE location (
   locationID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
   ...
) ENGINE = InnoDB;

CREATE TABLE assignment (
   assignmentID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   locationID INT NOT NULL,
   FOREIGN KEY locationIDX (locationID) REFERENCES location (locationID)
   ...
) ENGINE = InnoDB;

CREATE TABLE assignmentStuff (
   ...
   assignmentID INT NOT NULL,
   FOREIGN KEY assignmentIDX (assignmentID) REFERENCES assignment (assignmentID)
) ENGINE = InnoDB;

Le problème est que lorsque j'essaie de supprimer l'une des colonnes de clé étrangère (c'est-à-dire locationIDX), cela me donne une erreur.

"ERREUR 1025 (HY000): Erreur lors du changement de nom"

Comment puis-je supprimer la colonne dans le tableau d'affectation ci-dessus sans obtenir cette erreur?

A dessiné
la source

Réponses:

459

Comme expliqué ici , il semble que la contrainte de clé étrangère doit être supprimée par le nom de la contrainte et non par le nom de l'index. La syntaxe est:

alter table footable drop foreign key fooconstraint
pugmarx
la source
35
C'était mon problème. Je me sens un peu stupide maintenant. Si quelqu'un d'autre a ce problème, vous pouvez trouver les noms de contrainte de clé étrangère à l'aide de la fonction SHOW CREATE TABLE.
Tiré
15
Astuce: utilisez SHOW CREATE TABLE footable;pour voir quel est le nom de la contrainte. Ce n'est pas le nom de la colonne en soi. Merci d'avoir répondu!
Chris Baker
3
Vous pouvez utiliser ceci pour trouver des contraintes de clé étrangère: SELECT * FROM information_schema.table_constraints WHERE constraint_schema = '<votre nom de base de données>' AND constraint_type = 'FOREIGN KEY'
Gayan Dasanayake
21

Les clés étrangères sont là pour garantir l'intégrité des données, vous ne pouvez donc pas supprimer une colonne tant qu'elle fait partie d'une clé étrangère. Vous devez d'abord déposer la clé.

Je pense que la requête suivante le ferait:

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX;
zombat
la source
17

Comme tout le monde l'a dit ci-dessus, vous pouvez facilement supprimer un FK. Cependant, je viens de remarquer qu'il peut être nécessaire de supprimer la clé elle-même à un moment donné. Si vous avez un message d'erreur pour créer un autre index comme le dernier, je veux dire avec le même nom, il serait utile de supprimer tout ce qui est lié à cet index.

ALTER TABLE your_table_with_fk
  drop FOREIGN KEY name_of_your_fk_from_show_create_table_command_result,
  drop KEY the_same_name_as_above
Karla Danitza Duran Memijes
la source
10

Vérifiez quel est le nom CONSTRAINT et le nom FOREIGN KEY:

SHOW CREATE TABLE table_name;

Supprimez à la fois le nom CONSTRAINT et le nom FOREIGN KEY:

ALTER TABLE table_name
  DROP FOREIGN KEY the_name_after_CONSTRAINT,
  DROP KEY the_name_after_FOREIGN_KEY;

J'espère que cela t'aides!

norodine
la source
4

Voici un moyen de supprimer la contrainte de clé étrangère, cela fonctionnera. MODIFIER TABLElocation . location_id DROP FOREIGN KEY location_ibfk_1;

Roi du rocher Kirant
la source
2

Hé, j'ai suivi une séquence ci-dessus et j'ai trouvé une solution.

SHOW CREATE TABLE footable;

Vous obtiendrez le nom de la contrainte FK comme

ProjectsInfo_ibfk_1

Vous devez maintenant supprimer ces contraintes. par alter table commantd

alter table ProjectsInfo drop foreign key ProjectsInfo_ibfk_1;

Puis déposez la colonne du tableau,

alter table ProjectsInfo drop column clientId;
Pratik Gaurav
la source
1

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 la partie délicate 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 trouver cela, exécutez la sélection suivante:

SHOW CREATE TABLE region; Cela devrait vous montrer une ligne, dans le coin supérieur gauche, cliquez sur l'option +, cliquez sur le bouton de texte intégral raio puis cliquez sur le bouton aller.Vous obtiendrez le nom de l'index, quelque chose comme ceci:

CONSTRAINT region_ibfk_1 FOREIGN KEY (country_id) REFERENCES country (id) ON SUPPRIMER PAS D'ACTION SUR MISE À JOUR PAS D'ACTION Il suffit maintenant d'émettre un:

alter table region drop clé étrangère region_ibfk_1;

ou

plus simplement tapez simplement: - alter table TableName drop clé étrangère TableName_ibfk_1 ;

rappelez-vous que la seule chose à faire est d'ajouter _ibfk_1 après votre nom de table pour faire comme ceci: - TableName _ibfk_1

Abinash Hota
la source
0

Vous ne pouvez pas supprimer la colonne de clé étrangère car elle est référencée à partir de la table assignmentStuff. Vous devez donc d'abord supprimer la contrainte de clé étrangère assignmentStuff.assignmentIDX.

Une question similaire a déjà été posée ici . Vérifiez également ici pour plus d'informations.

Ronald Wildenberg
la source
1
Donc, parce que assignmentStuff fait référence à la clé primaire de l'affectation, je ne peux pas supprimer la colonne locationID de l'affectation? Cela semble un peu contre-intuitif.
Tiré
Il semble que j'ai changé de nom de colonne, donc ma réponse n'a pas vraiment de sens. Désolé pour ça ...
Ronald Wildenberg
0

Essaye ça:

alter table Documents drop
  FK__Documents__Custo__2A4B4B5E
Shailendra Mishra
la source
0

étape 1: show create table vendor_locations;

étape 2: ALTER TABLE vendor_locations drop foreign key vendor_locations_ibfk_1;

cela a fonctionné pour moi.

Jyothi M
la source
0

il faut d'abord obtenir le nom réel de la contrainte par cette requête

SHOW CREATE TABLE TABLE_NAME

Cette requête entraînera le nom de contrainte de la clé étrangère, maintenant la requête ci-dessous la supprimera.

ALTER TABLE TABLE_NAME DROP FOREIGN KEY COLUMN_NAME_ibfk_1

le dernier nombre dans le nom de la contrainte ci-dessus dépend du nombre de clés étrangères que vous avez dans la table

Owais Akber
la source