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: