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.
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;
...
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);
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.
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.
Si vous utilisez MySQL Workbench, vous devrez désactiver SAFE UPDATE en effectuant les 3 étapes suivantes:
(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.
(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.