2009-05-08 14 views
128

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

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 quand je suis en train d'abandonner l'une des colonnes de clé étrangère (c.-à-locationIDX), il me donne une erreur.

"ERREUR 1025 (HY000): Erreur sur renommage"

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

Répondre

332

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

alter table footable drop foreign key fooconstraint 
+25

C'était mon problème. Je me sens un peu bête maintenant. Si quelqu'un d'autre a ce problème, vous pouvez trouver les noms de contrainte de clé étrangère en utilisant la fonction SHOW CREATE TABLE. – Drew

+0

cela a fonctionné pour moi – bynu022

+5

Astuce: utilisez 'SHOW CREATE TABLE footable;' pour voir le nom de la contrainte. Ce n'est pas le nom de la colonne en soi. Merci d'avoir répondu! –

0

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 devez d'abord supprimer la contrainte de clé étrangère assignmentStuff.assignmentIDX.

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

+1

Ainsi, parce que la clé primaire de l'affectation des références assignmentStuff, je ne peux pas laisser tomber la colonne LocationID de cession? Cela semble plutôt contre-intuitif. – Drew

+0

Il semble que j'ai changé certains noms de colonnes, donc ma réponse n'a pas vraiment de sens. Désolé pour ça ... –

+0

Pas de soucis, mon pote – Drew

20

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

Je pense la requête suivante ferait:

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX; 
3

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

0

Essayez ceci:

alter table Documents drop 
    FK__Documents__Custo__2A4B4B5E 
8

Comme tout le monde dit ci-dessus, 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 concerne 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 
4

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

SHOW CREATE TABLE table_name; 

Retirez les deux le nom de CONTRAINTE et le nom FOREIGN KEY:

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

Hope this helps!

1

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 faire la table alter et supprimer la colonne. Mais le plus difficile est que vous ne pouvez pas supprimer la clé étrangère en utilisant le nom de la colonne, mais que vous deviez trouver le nom utilisé pour l'indexer.Pour trouver cela, tapez la commande suivante:

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

CONTRAINTE region_ibfk_1 ÉTRANGER KEY (country_id) REFERENCES country (id) ON SUPPRIMER NO ACTION ON UPDATE NO ACTION Maintenant, il suffit d'émettre un:

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

ou

plus simplement il suffit de taper: - alter table TableName drop clé TableName_ibfk_1 étrangère;

rappelez-vous la seule chose est d'ajouter _ibfk_1 après votre tablename faire comme ceci: - TableName _ibfk_1