sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo cambiar una ID de tabla de serie a identidad?

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;

Hay dos variables:

  • el nombre real de la SEQUENCE adjunta . Usé el nombre predeterminado anterior, pero el nombre puede diferir.
  • el valor máximo actual en client.clientid . No tiene que ser 107, solo porque actualmente hay 107 filas.

Esta consulta obtiene ambos:

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

Una serial la columna es un integer columna que propiedad una secuencia dedicada y tiene su configuración predeterminada para dibujar a partir de ella (como se puede ver en la definición de la tabla que publicó). Para que sea un integer simple , suelte el valor predeterminado y luego suelte la secuencia.

Convertir la columna en una IDENTITY añade su propia secuencia. Usted debe elimine la secuencia de propiedad anterior (o al menos la propiedad, que muere al eliminar la secuencia). De lo contrario, obtendrá errores como:

¿Cómo copiar la estructura y el contenido de una tabla, pero con una secuencia separada?

Luego convierta el integer simple columna a una IDENTITY y reinicie con el máximo actual más 1 . Usted debe establezca el valor actual de la nueva secuencia interna para evitar infracciones únicas.

Envuélvalo todo en una sola transacción, para que no se arruine a la mitad de la migración. Todos estos comandos DDL son transaccionales en Postgres, se pueden revertir hasta que se confirmen y solo son visibles para otras transacciones que comiencen después de eso.

Su columna era PK antes y sigue siendo PK. Esto es ortogonal al cambio.

Peter Eisentraut, autor principal de (nuevo en Postgres 10) IDENTITY característica, también proporcionó una función upgrade_serial_to_identity() para convertir serial existente columnas Reutiliza la secuencia existente y, en su lugar, actualiza los catálogos del sistema directamente, lo que no debe hacer usted mismo a menos que sepa exactamente lo que está haciendo. También cubre casos de esquina exóticos. Compruébalo (capítulo "Actualización"):

Sin embargo, la función no funcionará en la mayoría de los servicios alojados que no permiten la manipulación directa de los catálogos del sistema. Luego volverá a los comandos DDL como se indica en la parte superior.

Relacionado: