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 командите, както е указано в горната част.
Свързани: