EFFACER en CASCADE juste une fois
J'ai une base de données Postgresql sur lequel je veux faire un peu de suppressions en cascade. Cependant, les tableaux ne sont pas mis en place avec la clause on DELETE CASCADE de règle. Est il possible que je peux supprimer et dire Postgresql cascade juste cette fois? Quelque chose d'équivalent à
DELETE FROM some_table CASCADE;
Les réponses à cette ancienne question le faire paraître comme pas une telle solution existe, mais j'ai pensé que je voudrais poser cette question explicitement juste pour être sûr.
- Veuillez voir ma fonction personnalisée ci-dessous. C'est possible, avec certaines restrictions.
Vous devez vous connecter pour publier un commentaire.
Pas. Le faire juste une fois, vous pouvez tout simplement écrire l'instruction delete pour la table que vous souhaitez cascade.
Si vous voulez vraiment
DELETE FROM some_table CASCADE;
qui signifie "supprimer toutes les lignes de la tablesome_table
", vous pouvez utiliserTRUNCATE
au lieu deDELETE
etCASCADE
est toujours pris en charge. Cependant, si vous souhaitez utiliser la suppression sélective avec unwhere
clause,TRUNCATE
n'est pas assez bon.À UTILISER AVEC précaution - Ce sera chute de toutes les lignes de toutes les tables qui ont une contrainte de clé étrangère sur
some_table
et toutes les tables qui ont des contraintes sur les tables, etc.Postgres prend en charge
CASCADE
avec TRUNCATE:Haut la main c'est transactionnelle (c'est à dire peut être annulée), même si elle n'est pas complètement isolé des autres transactions simultanées, et a plusieurs autres mises en garde. Lisez la documentation pour plus de détails.
DELETE FROM some_table CASCADE;
." Cette réponse est sur ce dernier problème, mais rarement la chose que l'on souhaite faire dans la réalité.J'ai écrit un (récursif) la fonction pour supprimer une ligne basé sur sa clé primaire. J'ai écrit cela parce que je n'ai pas envie de créer mes contraintes comme "on delete cascade". Je voulais être en mesure de supprimer des ensembles complexes de données (en DBA) mais ne permet pas à mon programmeurs pour être en mesure de supprimer en cascade sans réfléchir à toutes les conséquences.
Je suis toujours tester cette fonction, donc il peut y avoir des bugs dans les -- mais s'il vous plaît ne pas essayer si votre DB, le multi colonne primaire (et donc étrangère) de la télécommande. Aussi, les clés de tous afin de pouvoir être représenté dans la forme d'une chaîne, mais il pourrait être écrit d'une manière qui n'a pas cette restriction. J'utilise cette fonction avec beaucoup de PARCIMONIE, de toute façon, j'en valeur mes données trop pour activer la cascade de contraintes sur tout.
Fondamentalement, cette fonction est passée dans le schéma, nom de table, et de la valeur primaire (dans la forme d'une chaîne), et il va commencer par trouver les clés étrangères de la table et permet de s'assurer de données n'existe pas, s'il n', il appelle de manière récursive en soi sur les données trouvées. Il utilise un tableau de données déjà marqué pour suppression pour éviter les boucles infinies. Merci de le tester et laissez-moi savoir comment cela fonctionne pour vous. Remarque: Il est un peu lent.
Je l'appelle comme ça:
select delete_cascade('public','my_table','1');
IN
opérateur avec des sous-sélectionne au lieu de=
(donc étape à utiliser des ensembles de la logique), il serait devenu bien le plus rapide.Si je comprends bien, vous devriez être en mesure de faire ce que vous voulez en supprimant la contrainte de clé étrangère, l'ajout d'un nouveau (qui sera en cascade), fais de ton stuff, et de recréer la restriction de la contrainte de clé étrangère.
Par exemple:
De sûr, vous devriez résumé des trucs comme ça dans une procédure, pour le bien de votre santé mentale.
Je ne peux pas commenter palehorse de réponse, j'ai ajouté ma propre réponse.
Palehorse logick est ok, mais l'efficacité peut être mauvais avec de grands jeux de données.
Il est plus rapide si vous avez des index sur des colonnes et de l'ensemble de données est plus grand que les quelques enregistrements.
Vous pouvez utiliser pour automatiser cela, vous pouvez définir une contrainte de clé étrangère avec
ON DELETE CASCADE
.Je cite le le manuel de contraintes de clés étrangères:
J'ai pris Joe Amour de la réponse et l'a réécrit l'aide de la
IN
opérateur avec des sous-sélectionne au lieu de=
pour rendre la fonction plus rapide (selon Hubbitus la suggestion):Le supprimer avec l'option cascade uniquement appliqués à des tables avec des clés étrangères définies. Si vous ne les supprimer, et il dit que vous ne pouvez parce que ce serait en violation de la contrainte de clé étrangère, la cascade va l'amener à supprimer la délinquance lignes.
Si vous souhaitez supprimer les lignes associées de cette façon, vous aurez besoin de définir les clés étrangères en premier. Aussi, n'oubliez pas que si vous l'avez explicitement demander d'entamer une transaction, ou si vous modifiez les paramètres par défaut, il fera une auto-commit, ce qui pourrait être très coûteux en temps de nettoyer.