web-dev-qa-db-fra.com

MySQL Supprimer des clés étrangères

J'ai une table dont la clé primaire est utilisée dans plusieurs autres tables et possède 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.-à-d. LocationIDX), cela me donne une erreur.

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

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

172
Drew

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

alter table footable drop foreign key fooconstraint
412
pugmarx

Les clés étrangères sont là pour assurer 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 laisser tomber la clé.

Je pense que la requête suivante le ferait:

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX;
21
zombat

Comme tout le monde l’a dit plus haut, vous pouvez facilement supprimer un FK. Cependant, je viens de remarquer qu'il peut être nécessaire de laisser tomber 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

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

SHOW CREATE TABLE table_name;

Supprimez 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!

8
norodin

Voici un moyen de supprimer la contrainte de clé étrangère, cela fonctionnera. ALTER TABLE location.location_id TOUCHER LA TOUCHE ÉTRANGÈRE location_ibfk_1;

3

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 une rangée, dans le coin supérieur gauche, cliquez sur l'option +, cliquez sur le bouton Raio du texte intégral, puis cliquez sur Go. Ici, vous obtiendrez le nom de l'index, à peu près comme ceci:

CONSTRAINT region_ibfk_1 FOREIGN KEY (ID_de_pays) REFERENCES pays (id) ON DELETE AUCUNE ACTION LORS DE LA MISE A JOUR AUCUNE ACTION Maintenant, émettez simplement un:

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

ou

plus simplement, tapez simplement: - alter table TableName drop foreign key TableName_ibfk_1;

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

1
Abinash Hota

Vous ne pouvez pas supprimer la colonne de clé étrangère car elle est référencée à partir de la table assignmentStuff. Donc, vous devriez 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.

0

step1: show create table vendor_locations;

étape2: ALTER TABLE vendor_locations drop foreign key vendor_locations_ibfk_1;

cela a fonctionné pour moi.

0
Jyothi M

Essaye ça:

alter table Documents drop
  FK__Documents__Custo__2A4B4B5E
0
Shailendra Mishra