Pro každého, kdo zde skončí a hledá, jak odstranit oddíly tabulky v PostgreSQL, je zde moderní odpověď.
Řešením není použít příkaz DELETE, protože tím dojde k odstranění dat, aniž by došlo k odstranění odpovídajících oddílů tabulky, které data uchovávaly. OP se zeptal na správu tabulek oddílů, nikoli na mazání záznamů, takže jakékoli řešení využívající příkazy DELETE přidává zbytečnou režii databáze na mazání záznamů, ponechává prázdné tabulky oddílů na místě a zcela ignoruje jednu z primárních výhod používání dělení; Shození stolu, když už není užitečné.
V tomto případě musí být řešením DROP již nepotřebnou tabulku oddílů. Napsal jsem řešení k vyřešení tohoto problému v mém produkčním prostředí, odpověď je zde .
K vyřešení problému OP lze funkci, kterou jsem napsal, použít se dvěma drobnými revizemi k úpravě fullTablename proměnnou a formát data. Řádek proměnné fullTablename musí být změněn z
fullTablename := base_table_name || '_' || to_char(startTime, dateFormat);
do formátu YYYY-MM-DD_log, jako je tento
fullTablename := to_char(startTime, dateFormat) || '_' || base_table_name;
Poté je třeba formát data mírně upravit z
WHEN partition_plan='day' THEN 'YYYYDDD'
podle uvedené konvence pojmenování tabulek
WHEN partition_plan='day' THEN 'YYYY-MM-DD'
Potom lze dotaz SQL, který volá funkci k provedení vyčištění, zavolat ze skriptu denní údržby, jako je tento:
SELECT public.drop_partitions(current_date-180, 'public', 'log', 5, 'day');
Což zruší tabulky YYYY-MM-DD_log, které jsou 5 dny starší než 180 před pár dny. Pro první spuštění k odstranění desítek nebo stovek starých oddílů tabulky 5 lze nastavit na mnohem vyšší hodnotu, která dosáhne požadovaného efektu.