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;
Existem duas variáveis:
- o nome real da
SEQUENCE
anexada . Usei o nome padrão acima, mas o nome pode ser diferente. - o valor máximo atual em
client.clientid
. Não precisa ser 107, apenas porque existem atualmente 107 linhas.
Esta consulta obtém ambos:
SELECT pg_get_serial_sequence('client', 'clientid'), max(clientid) FROM client;
Um
serial
coluna é um integer
coluna que possui uma sequência dedicada e tem seu padrão definido para desenhar a partir dela (como pode ser visto na definição da tabela que você postou). Para torná-lo um integer
simples , elimine o padrão e, em seguida, elimine a sequência. Convertendo a coluna em uma
IDENTITY
adiciona sua própria sequência. Você deve elimine a sequência de propriedade antiga (ou pelo menos a propriedade, que morre com a retirada da sequência). Caso contrário, você recebe erros como:Como copiar estrutura e conteúdo de uma tabela, mas com sequência separada?
Em seguida, converta o
integer
simples coluna para uma IDENTITY
coluna e reinicie com o máximo atual mais 1 . Você deve defina o valor atual da nova sequência interna para evitar violações exclusivas. Envolva tudo em uma única transação, para que você não estrague a meio caminho da migração. Todos esses comandos DDL são transacionais no Postgres, podem ser revertidos até serem confirmados e são visíveis apenas para outras transações que começam depois disso.
Sua coluna era PK antes e continua PK. Isso é ortogonal à mudança.
Peter Eisentraut, o principal autor do (novo no Postgres 10)
IDENTITY
recurso, também forneceu uma função upgrade_serial_to_identity()
para converter serial
existente colunas. Ele reutiliza a sequência existente e, em vez disso, atualiza os catálogos do sistema diretamente - o que você não deve fazer sozinho, a menos que saiba exatamente o que está fazendo. Também abrange casos de canto exóticos. Confira (capítulo "Atualizando"):No entanto, a função não funcionará na maioria dos serviços hospedados que não permitem a manipulação direta de catálogos do sistema. Então você está de volta aos comandos DDL conforme as instruções na parte superior.
Relacionado:
-
Como converter chave primária de inteiro para serial?
-
Coluna da tabela de incremento automático
-
Como copiar estrutura e conteúdo de uma tabela, mas com sequência separada?