PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да промените ID на таблица от сериен към идентичност?

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;

Има две променливи:

  • истинското име на прикачената SEQUENCE . Използвах името по подразбиране по-горе, но името може да е различно.
  • текущата максимална стойност в client.clientid . Не е задължително да е 107, само защото в момента има 107 реда.

Тази заявка получава и двете:

SELECT pg_get_serial_sequence('client', 'clientid'), max(clientid) FROM client;

serial колоната е integer колона, която притежава специална последователност и има настройка по подразбиране за извличане от нея (както може да се види от дефиницията на таблицата, която сте публикували). За да стане обикновено integer , изпуснете по подразбиране и след това изтрийте последователността.

Преобразуване на колоната в IDENTITY добавя своя собствена последователност. Вие трябва премахване на старата притежавана последователност (или поне собствеността, която умира с премахването на последователността). В противен случай получавате грешки като:

Как да копирате структура и съдържание на таблица, но с отделна последователност?

След това преобразувайте обикновеното integer колона към IDENTITY колона и рестартирайте с текущия максимум плюс 1 . Вие трябва задайте текущата стойност на новата вътрешна последователност, за да избегнете уникални нарушения.

Съберете всичко в една транзакция, така че да не се объркате на половината път в миграцията. Всички тези DDL команди са транзакционни в Postgres, могат да бъдат върнати назад, докато не бъдат ангажирани и са видими само за други транзакции, започващи след това.

Вашата колона беше PK преди и си остава PK. Това е ортогонално на промяната.

Питър Айзентраут, главният автор на (ново в Postgres 10) IDENTITY функция, също предостави функция upgrade_serial_to_identity() за преобразуване на съществуващ serial колони. Той използва повторно съществуващата последователност и вместо това директно актуализира системните каталози - което не трябва да правите сами, освен ако не знаете точно какво правите. Включва и екзотични ъглови кутии. Вижте го (глава „Надстройка“):

Функцията обаче няма да работи на повечето хоствани услуги, които не позволяват директно манипулиране на системни каталози. След това се връщате към DDL командите, както е указано в горната част.

Свързани:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да дефинирате първичен ключ за автоматично увеличение в PostgreSQL

  2. Как да намерите елементи с *всички* съвпадащи категории

  3. Как работи Floor() в PostgreSQL

  4. SQL, Postgres OID, какви са те и защо са полезни?

  5. Как мога да изпълня множество изрази в една заявка с Rails?