sql >> Databáze >  >> RDS >> PostgreSQL

Jak změnit ID tabulky ze sériového na identitu?

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í:



  1. Mapování pole pomocí režimu spánku

  2. Sloupec nemůže mít hodnotu null Mysql

  3. java.lang.ClassNotFoundException:com.microsoft.jdbc.sqlserver.SQLServerDriver:Načítám správný ovladač?

  4. ERROR 1064 (42000):Máte chybu v syntaxi SQL; Chcete nakonfigurovat heslo jako uživatel root