PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie lösche ich ungenutzte Sequenzen?

Zunächst einmal wird eine Sequenz, die automatisch für eine serielle Spalte erstellt wird, automatisch gelöscht , wenn die Spalte (oder die Tabelle, in der sie sich befindet) gelöscht wird. Das von Ihnen beschriebene Problem sollte zunächst nicht bestehen. Nur sehr alte Versionen von PostgreSQL taten dies nicht. 7.4 oder älter?

Lösung des Problems:

Diese Abfrage generiert die DDL-Befehle zum Löschen aller "ungebundenen" Sequenzen in der Datenbank wird es ausgeführt in:

SELECT string_agg('DROP SEQUENCE ' || c.oid::regclass, '; ') || ';' AS ddl
FROM   pg_class       c
LEFT   JOIN pg_depend d ON d.refobjid = c.oid
                       AND d.deptype <> 'i'
WHERE  c.relkind = 'S'
AND    d.refobjid IS NULL;

Die Umwandlung in regclass in c.oid::regclass automatisch Schema-qualifiziert Sequenznamen, wo nötig, gemäß dem aktuellen search_path . Siehe:

Ergebnis:

DROP SEQUENCE foo_id_seq;
DROP SEQUENCE bar_id_seq;
...

Führen Sie das Ergebnis aus, um alle Sequenzen zu löschen, die nicht an eine serielle Spalte (oder eine andere Spalte) gebunden sind. Studieren Sie die Bedeutung von Spalten und Tabellen hier .

Vorsicht obwohl! Das tut es nicht bedeuten, dass diese Sequenzen sonst nicht verwendet werden. Es gibt eine Reihe von Anwendungsfällen, in denen Sequenzen als eigenständige Objekte erstellt werden. Zum Beispiel, wenn Sie möchten, dass mehrere Spalten eine Sequenz teilen. Sie sollten genau wissen, was Sie tun.

Sie können es jedoch nicht Lösche Sequenzen, die an eine serial gebunden sind Spalte auf diese Weise. Die Operation ist also hier sicher Respekt.

DROP SEQUENCE test_id_seq

Ergebnis:

ERROR:  cannot drop sequence test_id_seq because other objects depend on it
DETAIL:  default for table test column id depends on sequence test_id_seq
HINT:  Use DROP ... CASCADE to drop the dependent objects too.