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;
Existují dvě proměnné:
- skutečný název připojené
SEQUENCE
. Použil jsem výchozí název výše, ale název se může lišit. - aktuální maximální hodnota v
client.clientid
. Nemusí jich být 107, jen proto, že je aktuálně 107 řádků.
Tento dotaz získá obojí:
SELECT pg_get_serial_sequence('client', 'clientid'), max(clientid) FROM client;
serial
sloupec je integer
sloupec, který vlastní vyhrazenou sekvenci a má výchozí nastavení, aby se z ní čerpalo (jak je vidět z definice tabulky, kterou jste zveřejnili). Aby to bylo obyčejné integer
, zrušte výchozí nastavení a poté zrušte sekvenci.
Převod sloupce na IDENTITY
přidá vlastní sekvenci. Musíte zahoďte starou vlastněnou sekvenci (nebo alespoň vlastnictví, které s vyhozením sekvence zanikne). Jinak se zobrazí chyby jako:
Jak zkopírovat strukturu a obsah tabulky, ale se samostatnou sekvencí?
Poté převeďte obyčejné integer
sloupec na IDENTITY
a restartujte s aktuálním maximem plus 1 . Musíte nastavte aktuální hodnotu nové vnitřní sekvence, abyste se vyhnuli jedinečným porušením.
Vše zabalte do jediné transakce, abyste se v polovině migrace nezkazili. Všechny tyto příkazy DDL jsou v Postgresu transakční, lze je vrátit zpět, dokud nejsou potvrzeny, a jsou viditelné pouze pro další transakce začínající poté.
Váš sloupec byl dříve PK a zůstane PK. Toto je ortogonální ke změně.
Peter Eisentraut, hlavní autor (nové v Postgres 10) IDENTITY
poskytuje také funkci upgrade_serial_to_identity()
převést existující serial
sloupců. Znovu používá stávající sekvenci a místo toho přímo aktualizuje systémové katalogy – což byste neměli dělat sami, pokud přesně nevíte, co děláte. Pokrývá také exotická rohová pouzdra. Podívejte se na to (kapitola "Upgrade"):
Tato funkce však nebude fungovat na většině hostovaných služeb, které neumožňují přímou manipulaci se systémovými katalogy. Poté se vrátíte k příkazům DDL podle pokynů nahoře.
Související: