Ich konvertiere eine Datenbank von Postgres nach MySQL.
Da ich kein Tool finde, das den Trick selbst ausführt, werde ich alle Postgres-Sequenzen in Autoincrement-IDs in MySQL mit Autoincrement-Wert konvertieren.
Wie kann ich also alle Sequenzen in einer Postgres- Datenbank ( Version 8.1 ) mit Informationen zu der Tabelle, in der sie verwendet wird, dem nächsten Wert usw. mit einer SQL-Abfrage auflisten?
Beachten Sie, dass ich die information_schema.sequences
Ansicht in Version 8.4 nicht verwenden kann .
Antworten:
Die folgende Abfrage gibt Namen aller Sequenzen an.
In der Regel wird eine Sequenz als benannt
${table}_id_seq
. Durch den einfachen Abgleich von Regex-Mustern erhalten Sie den Tabellennamen.Verwenden Sie die folgende Abfrage, um den letzten Wert einer Sequenz abzurufen:
quelle
${table}_id_seq
Hinweis war nützlich${table}_${column}_seq
für automatisch erstellte SequenzenBeachten Sie, dass Sie ab PostgreSQL 8.4 alle Informationen zu den in der Datenbank verwendeten Sequenzen erhalten können über:
Da ich eine höhere Version von PostgreSQL (9.1) verwende und nach derselben Antwort hoch und niedrig suchte, habe ich diese Antwort für die Nachwelt und für zukünftige Suchende hinzugefügt.
quelle
Führen Sie:
psql -E
und dann aus\ds
quelle
Nach ein bisschen Schmerz bekam ich es.
Der beste Weg, dies zu erreichen, besteht darin, alle Tabellen aufzulisten
Listen Sie dann für jede Tabelle alle Spalten mit Attributen auf
Testen Sie dann für jede Spalte, ob sie eine Sequenz hat
und erhalten Sie dann die Informationen zu dieser Sequenz
quelle
Sequenzinfo: Maximalwert
SELECT * FROM information_schema.sequences;
Sequenzinfo: letzter Wert
SELECT * FROM <sequence_name>
quelle
Die Beziehung zwischen automatisch generierten Sequenzen (z. B. solchen, die für SERIAL-Spalten erstellt wurden) und der übergeordneten Tabelle wird durch das Sequenzbesitzerattribut modelliert.
Sie können diese Beziehung mit der OWNED BY-Klausel des Befehls ALTER SEQUENCE ändern
zB ALTER SEQUENCE foo_id OWNED von foo_schema.foo_table
um festzulegen, dass es mit der Tabelle foo_table verknüpft wird
oder ALTER SEQUENCE foo_id OWNED by NONE
um die Verbindung zwischen der Sequenz und einer beliebigen Tabelle zu unterbrechen
Die Informationen zu dieser Beziehung werden in der Katalogtabelle pg_depend gespeichert .
Die Verknüpfungsbeziehung ist die Verknüpfung zwischen pg_depend.objid -> pg_class.oid WHERE relkind = 'S' - die die Sequenz mit dem Verknüpfungsdatensatz verknüpft, und dann pg_depend.refobjid -> pg_class.oid WHERE relkind = 'r', die die verknüpft Datensatz mit der Eigentümerbeziehung verbinden (Tabelle)
Diese Abfrage gibt alle Sequenz-> Tabellenabhängigkeiten in einer Datenbank zurück. Die where-Klausel filtert es so, dass es nur automatisch generierte Beziehungen enthält, wodurch es darauf beschränkt wird, nur Sequenzen anzuzeigen, die von Spalten vom Typ SERIAL erstellt wurden.
quelle
Ich weiß, dass dieser Beitrag ziemlich alt ist, aber ich fand die Lösung von CMS sehr nützlich, da ich nach einer automatisierten Möglichkeit suchte, eine Sequenz mit der Tabelle AND-Spalte zu verknüpfen, und sie teilen wollte. Die Verwendung der Katalogtabelle pg_depend war der Schlüssel. Ich erweiterte, was getan wurde, um:
Diese Version fügt der Liste der zurückgegebenen Felder eine Spalte hinzu. Durch den Aufruf von pg_set_serial_sequence können Sie mit dem Tabellennamen und dem Spaltennamen auf einfache Weise sicherstellen, dass alle Sequenzen in der Datenbank korrekt festgelegt sind. Beispielsweise:
Hoffe das hilft jemandem beim Zurücksetzen von Sequenzen!
quelle
Diese Anweisung listet die Tabelle und Spalte auf, die jeder Sequenz zugeordnet sind:
Code:
mehr siehe hier Link zur Antwort
quelle
Verbesserung der vorherigen Antwort:
quelle
Teilweise getestet, sieht aber größtenteils vollständig aus.
Guthaben, bei dem Guthaben fällig ist ... Es wurde teilweise aus dem SQL rückentwickelt, das von a \ d in einer bekannten Tabelle mit einer Sequenz protokolliert wurde. Ich bin sicher, es könnte auch sauberer sein, aber hey, Leistung war kein Problem.
quelle
Eine Art Hack, aber versuchen Sie Folgendes:
Entfernen Sie die letzte UNION und führen Sie das Ergebnis aus
quelle
Rufen Sie Sequenzen für jede Spalte jeder Tabelle ab, indem Sie die DEFAULT-Klausel analysieren. Diese Methode liefert Informationen darüber, mit welchen Spaltensequenzen verknüpft ist, und verwendet keine Abhängigkeiten, die für einige Sequenzen möglicherweise nicht vorhanden sind. Auch die
pg_get_serial_sequence(sch.nspname||'.'||tbl.relname, col.attname)
Funktion hat nicht alle Sequenzen für mich gefunden!Lösung:
Beachten Sie, dass 1 Sequenz in mehreren Tabellen verwendet werden kann, sodass sie hier in mehreren Zeilen aufgelistet werden kann.
quelle
Danke für Ihre Hilfe.
Hier ist die Funktion pl / pgsql, die jede Sequenz einer Datenbank aktualisiert.
quelle
Hier ist eine andere, die den Schemanamen neben dem Sequenznamen hat
quelle
Diese Funktion zeigt den letzten Wert jeder Sequenz an.
Es gibt eine 2-Spalten-Tabelle aus, die den Sequenznamen plus den zuletzt generierten Wert enthält.
quelle
Unter der Annahme
exec()
, dass in diesem Beitrag https://stackoverflow.com/a/46721603/653539 eine Funktion deklariert wurde , können Sequenzen zusammen mit ihren letzten Werten mit einer einzigen Abfrage abgerufen werden:quelle
quelle
Hier ist ein Beispiel, wie
psql
Sie eine Liste aller Sequenzen mit ihrenlast_value
folgenden Angaben abrufen können :psql -U <username> -d <database> -t -c "SELECT 'SELECT ''' || c.relname || ''' as sequence_name, last_value FROM ' || c.relname || ';' FROM pg_class c WHERE (c.relkind = 'S')" | psql -U <username> -d <database> -t
quelle