BEGIN;
ALTER TABLE public.client ALTER clientid DROP DEFAULT; -- drop default
DROP SEQUENCE public.client_clientid_seq; -- drop owned sequence
ALTER TABLE public.client
-- ALTER clientid SET DATA TYPE int, -- not needed: already int
ALTER clientid ADD GENERATED ALWAYS AS IDENTITY (RESTART 108);
COMMIT;
Istnieją dwie zmienne:
- rzeczywista nazwa dołączonej
SEQUENCE
. Użyłem powyżej domyślnej nazwy, ale nazwa może się różnić. - aktualna maksymalna wartość w
client.clientid
. Nie musi to być 107, tylko dlatego, że obecnie jest 107 wierszy.
To zapytanie otrzyma oba:
SELECT pg_get_serial_sequence('client', 'clientid'), max(clientid) FROM client;
serial
kolumna jest integer
kolumna, która jest właścicielem dedykowaną sekwencję i ma domyślny zestaw do czerpania z niej (jak widać z opublikowanej przez Ciebie definicji tabeli). Aby była to zwykła integer
, usuń domyślną, a następnie usuń sekwencję.
Konwertowanie kolumny na IDENTITY
dodaje własną sekwencję. musisz usuń starą posiadaną sekwencję (lub przynajmniej własność, która umiera wraz z porzuceniem sekwencji). W przeciwnym razie pojawiają się błędy, takie jak:
Jak skopiować strukturę i zawartość tabeli, ale z osobną sekwencją?
Następnie przekonwertuj zwykłą integer
kolumna do IDENTITY
i uruchom ponownie z bieżącym maksimum plus 1 . musisz ustaw bieżącą wartość nowej sekwencji wewnętrznej, aby uniknąć unikalnych naruszeń.
Zapakuj to wszystko w jedną transakcję, aby nie zepsuć się w połowie migracji. Wszystkie te polecenia DDL są transakcyjne w Postgresie, można je wycofać do czasu zatwierdzenia i są widoczne tylko dla innych transakcji rozpoczynających się później.
Twoja kolumna była wcześniej PK i pozostaje PK. To jest prostopadłe do zmiany.
Peter Eisentraut, główny autor (nowości w Postgres 10) IDENTITY
funkcja, udostępniła również funkcję upgrade_serial_to_identity()
przekonwertować istniejący serial
kolumny. Ponownie wykorzystuje istniejącą sekwencję, a zamiast tego bezpośrednio aktualizuje katalogi systemowe - czego nie powinieneś robić sam, chyba że wiesz dokładnie, co robisz. Obejmuje również egzotyczne narożniki. Sprawdź to (rozdział „Aktualizacja”):
Jednak funkcja nie będzie działać w większości usług hostowanych, które nie pozwalają na bezpośrednią manipulację katalogami systemowymi. Następnie wracasz do poleceń DDL zgodnie z instrukcją u góry.
Powiązane:
-
Jak konwertować klucz podstawowy od liczby całkowitej do numeru seryjnego?
-
Jak skopiować strukturę i zawartość tabeli, ale z osobną sekwencją?