web-dev-qa-db-fra.com

Supprimer toutes les clés étrangères de la base de données (MySql)

Je voudrais renommer une colonne dans une table qui est une clé étrangère à plusieurs tables. Apparemment, cela n’est possible que si vous supprimez les contraintes, comme je l’ai découvert dans ce link .

Je ne veux pas supprimer manuellement tous les constratints. Existe-t-il un moyen de supprimer toutes les contraintes de clé étrangère de la base de données?

J'ai aussi essayé SET FOREIGN_KEY_CHECKS=0; mais je ne peux toujours pas renommer la colonne.

18
Borut Flis

Vous pouvez utiliser ce SQL pour générer ALTER TABLES (!!YOUR_SCHEMA_HERE!! doit être remplacé par votre schéma):

SELECT concat('alter table ',table_schema,'.',table_name,' DROP FOREIGN KEY ',constraint_name,';')
FROM information_schema.table_constraints
WHERE constraint_type='FOREIGN KEY'
AND table_schema='!!YOUR_SCHEMA_HERE!!';

Il va générer du SQL comme ceci:

alter table viewpoint_test.answer_code DROP FOREIGN KEY fk_answer_code_codebook_item1;
alter table viewpoint_test.answer_code DROP FOREIGN KEY fk_answer_code_questionary_answer1;
alter table viewpoint_test.codebook DROP FOREIGN KEY codebook_ibfk_1;
...
30
lopisan

Vous pouvez essayer d'utiliser comme de suivre ..

ALTER TABLE tableName
DROP FOREIGN KEY fieldName;
ADD FOREIGN KEY (newForignKeyFieldName);

Aussi, vous pouvez essayer avec Reference Key.As like .....

ALTER TABLE tableName
DROP FOREIGN KEY fieldName;
ADD FOREIGN KEY (newForignKeyFieldName)
REFERENCES anotherTableName(reference_id);
1
Md. Maruf Hossain

La requête suivante construira automatiquement la syntaxe correcte. Assurez-vous de mettre votre vrai nom de schéma de base de données dans la condition WHERE. Exécutez simplement chaque ligne renvoyée et tous vos FOREIGN KEYS seront supprimés.

Je laisse l'inverse (en les rajoutant) comme un exercice pour vous.

SELECT CONCAT("alter table ", TABLE_NAME," drop foreign key ", CONSTRAINT_NAME,"; ") AS runMe
FROM information_schema.key_column_usage 
WHERE TABLE_SCHEMA='MY_SCHEMA_NAME' AND CONSTRAINT_NAME <> 'PRIMARY';

Si vous souhaitez qu'il soit indépendant du schéma, vous pouvez écrire: TABLE_SCHEMA=DATABASE() pour obtenir le nom de la base de données active en cours.

1
Dewey

J'avais toujours des problèmes après avoir trouvé ce fil, mais j'ai semblé trouver un flux de travail qui fonctionne pour moi.

Suppression de la base de données

Si vous utilisez MySQL Workbench, vous devrez désactiver SAFE UPDATE en effectuant les 3 étapes suivantes:

  1. MySql Workbench> Préférences> SQL EDITOR> (bas des paramètres)
  2. éteindre le SAFE UPDATE
  3. puis déconnectez-vous de votre connexion et reconnectez-vous

Étapes pour démarrer la base de données de purge et en commencer une nouvelle

  1. Supprimer toutes les données des tables

(Ce script MySQL créera un script DELETE FROM pour chaque table de votre base de données.)

SELECT concat('DELETE FROM ',table_schema,'.',table_name,';') FROM information_schema.table_constraints WHERE table_schema='!!TABLE_SCHEMA!!';

Copiez le résultat et lancez-le. Vous pourriez avoir besoin de cela ligne par ligne.

  1. Supprimer toutes les clés étrangères de vos tables

(Ce script MySQL créera un script ALTER TABLE _ DROP FOREIGN KEY pour chaque table de votre base de données.)

SELECT concat('alter table ',table_schema,'.',table_name,' DROP FOREIGN KEY ',constraint_name,';') FROM information_schema.table_constraints WHERE constraint_type='FOREIGN KEY' AND table_schema='!!TABLE_SCHEMA!!';

Copiez le résultat et lancez-le. Vous pourriez avoir besoin de cela ligne par ligne.

Une fois que vous avez terminé, vous DEVEZ pouvoir exécuter votre script DROP DATABASE.

0
MaylorTaylor