Konwertuję bazę danych z postgres na mysql.
Ponieważ nie mogę znaleźć narzędzia, które samo załatwi sprawę, zamierzam przekonwertować wszystkie sekwencje postgres na identyfikatory autoincrement w mysql z wartością autoincrement.
Jak więc mogę wyświetlić listę wszystkich sekwencji w Postgres DB ( wersja 8.1 ) z informacjami o tabeli, w której jest używany, następną wartością itp. Z zapytaniem SQL?
Należy pamiętać, że nie mogę używać information_schema.sequences
widoku w wersji 8.4.
Odpowiedzi:
Poniższe zapytanie podaje nazwy wszystkich sekwencji.
Zazwyczaj sekwencja nosi nazwę
${table}_id_seq
. Proste dopasowanie do wzorca wyrażenia regularnego daje nazwę tabeli.Aby uzyskać ostatnią wartość sekwencji, użyj następującego zapytania:
źródło
${table}_id_seq
Wskazówkę była przydatna${table}_${column}_seq
dla automatycznie utworzonych sekwencjiZwróć uwagę, że począwszy od PostgreSQL 8.4 możesz uzyskać wszystkie informacje o sekwencjach używanych w bazie danych poprzez:
Ponieważ używam wyższej wersji PostgreSQL (9.1) i szukałem tej samej odpowiedzi na wysokim i niskim poziomie, dodałem tę odpowiedź ze względu na potomność i przyszłych poszukiwaczy.
źródło
Uruchom:,
psql -E
a następnie\ds
źródło
po odrobinie bólu, mam to.
najlepszym sposobem na osiągnięcie tego jest wypisanie wszystkich tabel
a następnie dla każdej tabeli podaj listę wszystkich kolumn z atrybutami
następnie dla każdej kolumny sprawdź, czy ma sekwencję
a następnie uzyskaj informacje o tej sekwencji
źródło
informacja o sekwencji: wartość maksymalna
SELECT * FROM information_schema.sequences;
informacja o sekwencji: ostatnia wartość
SELECT * FROM <sequence_name>
źródło
Relacja między automatycznie generowanymi sekwencjami (takimi jak te utworzone dla kolumn SERIAL) a tabelą nadrzędną jest modelowana przez atrybut właściciela sekwencji.
Możesz zmodyfikować tę relację za pomocą klauzuli OWNED BY pliku ALTER SEQUENCE
np. ALTER SEQUENCE foo_id OWNED by foo_schema.foo_table
aby ustawić, aby był powiązany z tabelą foo_table
lub ALTER SEQUENCE foo_id OWNED by NONE
aby przerwać połączenie między sekwencją a dowolną tabelą
Informacje o tej relacji są przechowywane w tabeli katalogu pg_depend .
relacja łączenia jest połączeniem między pg_depend.objid -> pg_class.oid WHERE relkind = 'S' - które łączy sekwencję z rekordem łączenia, a następnie pg_depend.refobjid -> pg_class.oid WHERE relkind = 'r', które łączy dołącz rekord do relacji będącej właścicielem (tabela)
To zapytanie zwraca wszystkie sekwencje -> zależności tabel w bazie danych. Klauzula where filtruje ją tak, aby zawierała tylko relacje generowane automatycznie, co ogranicza ją do wyświetlania tylko sekwencji utworzonych przez kolumny o typie SERIAL.
źródło
Wiem, że ten post jest dość stary, ale rozwiązanie CMS okazało się bardzo przydatne, ponieważ szukałem automatycznego sposobu na połączenie sekwencji z tabelą ORAZ kolumną i chciałem się nimi podzielić. Zastosowanie pg_depend tabeli katalogu był klucz. Rozszerzyłem to, co zostało zrobione, aby:
Ta wersja dodaje kolumnę do listy zwróconych pól. Mając pod ręką zarówno nazwę tabeli, jak i nazwę kolumny, wywołanie pg_set_serial_sequence ułatwia upewnienie się, że wszystkie sekwencje w bazie danych są ustawione poprawnie. Na przykład:
Mam nadzieję, że to pomoże komuś z resetowaniem sekwencji!
źródło
Ta instrukcja zawiera tabelę i kolumnę skojarzoną z każdą sekwencją:
Kod:
więcej zobacz tutaj link do odpowiedzi
źródło
Poprawa poprzedniej odpowiedzi:
źródło
Częściowo przetestowane, ale wygląda na kompletne.
Kredyt tam, gdzie należny jest kredyt ... jest częściowo odtwarzany na podstawie kodu SQL zarejestrowanego z a \ d na znanej tabeli, która miała sekwencję. Jestem pewien, że może być też czystszy, ale hej, wydajność nie była problemem.
źródło
Coś w rodzaju włamania, ale spróbuj tego:
Usuń ostatnią UNION i wykonaj wynik
źródło
Uzyskaj sekwencje dla każdej kolumny każdej tabeli poprzez analizę klauzuli DEFAULT. Ta metoda dostarcza informacji o połączonych sekwencjach kolumn i nie używa zależności, które mogą nie istnieć dla niektórych sekwencji. Nawet
pg_get_serial_sequence(sch.nspname||'.'||tbl.relname, col.attname)
funkcja nie znalazła dla mnie wszystkich sekwencji!Rozwiązanie:
Zwróć uwagę, że 1 sekwencja może być używana w wielu tabelach, więc można ją tutaj wyświetlić w wielu wierszach.
źródło
Dzięki za pomoc.
Oto funkcja pl / pgsql, która aktualizuje każdą sekwencję bazy danych.
źródło
Oto kolejny, który ma nazwę schematu obok nazwy sekwencji
źródło
Ta funkcja pokazuje ostatnią_wartość każdej sekwencji.
Wyprowadza tabelę z 2 kolumnami, która zawiera nazwę sekwencji oraz ostatnią wygenerowaną wartość.
źródło
Zakładając
exec()
funkcję zadeklarowaną w tym poście https://stackoverflow.com/a/46721603/653539 , sekwencje wraz z ich ostatnimi wartościami można pobrać jednym zapytaniem:źródło
źródło
Oto przykład, jak użyć,
psql
aby uzyskać listę wszystkich sekwencji z ichlast_value
: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
źródło