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:
- So überprüfen Sie, ob eine Tabelle in einem bestimmten Schema vorhanden ist
- Wie beeinflusst der Suchpfad die Auflösung der Kennung und das "aktuelle Schema"
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.