PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak zmienić identyfikator tabeli z szeregowego na tożsamość?

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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Createuser:nie można połączyć się z postgresem bazy danych:FATAL:rola tom nie istnieje

  2. Grupa stref czasowych RoR Postgresql przez niedziałanie na Heroku

  3. NodeJS — Dodaj tablicę ciągu znaków w zapytaniu PostgreSQL

  4. Warunek SQL LIKE do sprawdzenia liczby całkowitej?

  5. Czysty sposób na korzystanie z funkcji okna postgresql w django ORM?