PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como alterar um ID de tabela de serial para identity?

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: