Pour tous ceux qui cherchent ici comment supprimer les partitions de table dans PostgreSQL, voici la réponse moderne.
La solution consiste à ne pas utiliser une instruction DELETE car cela supprimera les données sans supprimer les partitions de table correspondantes qui contenaient les données. L'OP a posé des questions sur la gestion des tables de partition, et non sur la suppression d'enregistrements, de sorte que toute solution utilisant des instructions DELETE ajoute une surcharge de base de données inutile liée à la suppression d'enregistrements, laisse des tables de partition vides en place et ignore complètement l'un des principaux avantages de l'utilisation du partitionnement ; DROPing la table quand elle n'est plus utile.
Dans ce cas, la solution doit être de supprimer la table de partition qui n'est plus nécessaire. J'ai écrit une solution pour résoudre ce problème dans mon environnement de production, la réponse est ici .
Pour résoudre le problème de l'OP, la fonction que j'ai écrite peut être utilisée avec deux légères révisions pour modifier le fullTablename variable et le format de la date. La ligne variable fullTablename doit être changée de
fullTablename := base_table_name || '_' || to_char(startTime, dateFormat);
au format AAAA-MM-JJ_log comme ceci
fullTablename := to_char(startTime, dateFormat) || '_' || base_table_name;
Ensuite, le format de la date doit être légèrement modifié à partir de
WHEN partition_plan='day' THEN 'YYYYDDD'
à la convention de nommage de table indiquée
WHEN partition_plan='day' THEN 'YYYY-MM-DD'
Ensuite, la requête SQL qui appelle la fonction pour effectuer le nettoyage peut être appelée à partir d'un script de maintenance quotidienne comme celui-ci :
SELECT public.drop_partitions(current_date-180, 'public', 'log', 5, 'day');
Ce qui supprimera les tables YYYY-MM-DD_log qui sont 5 jours de plus de 180 il y a quelques jours. Pour une première exécution visant à supprimer des dizaines ou des centaines d'anciennes partitions de table, les 5 peut être réglé sur une valeur beaucoup plus élevée qui permet d'obtenir l'effet souhaité.