web-dev-qa-db-fra.com

Déposer une colonne avec une clé étrangère dans MySQL

J'ai les 2 tableaux suivants:

CREATE TABLE `personal_info` (
 `p_id` int(11) NOT NULL AUTO_INCREMENT,
 `name` text NOT NULL,
 `initials` text NOT NULL,
 `surname` text NOT NULL,
 `home_lang` int(11) NOT NULL,
 PRIMARY KEY (`p_id`),
 KEY `home_lang` (`home_lang`),
 CONSTRAINT `personal_info_ibfk_1` FOREIGN KEY (`home_lang`) REFERENCES `language_list` (`ll_id`)
) ENGINE=InnoDB AUTO_INCREMENT=44 DEFAULT CHARSET=latin1

CREATE TABLE `language_list` (
 `ll_id` int(11) NOT NULL AUTO_INCREMENT,
 `name` text NOT NULL,
 PRIMARY KEY (`ll_id`)
) ENGINE=InnoDB AUTO_INCREMENT=73 DEFAULT CHARSET=latin1

J'essaie de supprimer une colonne d'une table avec les éléments suivants:

ALTER TABLE `personal_info` DROP `home_lang`

Mais je ne peux pas le faire car je reçois cette erreur:

#1025 - Error on rename of '.\MyDB\#sql-112c_82' to '.\MyDB\personal_info' (errno: 150)

J'ai essayé de supprimer d'abord l'index puis de supprimer la colonne avec ceci:

ALTER TABLE personal_info DROP INDEX home_lang

Mais alors j'obtiens l'erreur suivante:

#1553 - Cannot drop index 'home_lang': needed in a foreign key constraint 

J'ai donc essayé de supprimer la clé étrangère:

ALTER TABLE personal_info DROP FOREIGN KEY home_lang

Mais reçu cette erreur:

#1025 - Error on rename of '.\MyDB\personal_info' to '.\MyDB\#sql2-112c-8d' (errno: 152)

J'ai également essayé de définir d'abord toutes les valeurs sur null:

update personal_info set home_lang = null

Mais a ensuite reçu cette erreur:

#1452 - Cannot add or update a child row: a foreign key constraint fails (`MyDB`.`personal_info`, CONSTRAINT `personal_info_ibfk_1` FOREIGN KEY (`home_lang`) REFERENCES `language_list` (`ll_id`))

Et maintenant je suis coincé. J'ai essayé plusieurs choses, mais je n'arrive pas à supprimer la colonne. Je ne suis pas autorisé à modifier la base de données autrement qu'en supprimant la colonne.

11
Eduan Bekker

Votre syntaxe DROP FOREIGN KEY Utilise le mauvais nom de clé. Il essaie de supprimer votre index "ordinaire" dans le champ home_lang. Ce n'est PAS la clé étrangère elle-même.

CONSTRAINT `personal_info_ibfk_1` FOREIGN KEY (`home_lang`) REFERENCES `language_list` (`ll_id`)
            ^^^^^^^^^^^^^^^^^^^^^--- THIS is the name of the foreign key

Essayer:

ALTER TABLE personal_info DROP FOREIGN KEY `personal_info_ibfk_1`
25
Marc B

Utilisez la requête ci-dessous pour trouver le nom de la clé étrangère.

SHOW CREATE TABLE forms_main;

Puis une fois que vous avez obtenu la clé, exécutez la commande drop foreign key

alter TABLE `forms_main`
drop FOREIGN key `forms_main_ibfk_1`;

Exécutez ensuite la commande drop column

ALTER TABLE `forms_main` DROP `company_id`;
1
Akshay Naik

MODIFIER TABLE db_name.table_name DROP FOREIGN KEY foreign_key; ALTER TABLE test.exam DROP INDEX id;

0
Hithaisri M K