Tengo una mesa con más de un millón de filas. Necesito restablecer la secuencia y reasignar la columna de identificación con nuevos valores (1, 2, 3, 4 ... etc.). ¿Hay alguna manera fácil de hacer eso?
postgresql
sequence
sennin
fuente
fuente
id
s no comenzó desde 1. Entonces el pedido resultó de la siguiente manera: 150, 151 ..., 300, 1, 2 ... Y supondría que eventualmente causaría errores de identificación duplicados, si no me hubiera reenumerado los id. Además, ordenar porid
es generalmente mejor que ordenar porcreated_at
. Y esto es lo que funcionó para mí .Respuestas:
Si no desea retener el orden de los identificadores, puede
Dudo que haya una manera fácil de hacerlo en el orden que elija sin recrear toda la tabla.
fuente
ALTER SEQUENCE seq RESTART WITH 1;
?SELECT setval('seq', 1, FALSE)
debería hacer lo mismo (aquí, el tercer argumento, FALSO, hace la magia, ya que muestra quenextval
debe ser 1 en lugar de 2)Con PostgreSQL 8.4 o posterior, ya no es necesario especificarlo
WITH 1
. Se usará el valor de inicio que se registróCREATE SEQUENCE
o se ajustó por últimaALTER SEQUENCE START WITH
vez (lo más probable es que sea 1).Restablecer la secuencia:
Luego actualice la columna de ID de la tabla:
Fuente: Documentos de PostgreSQL
fuente
Restablecer la secuencia:
Actualización de registros actuales:
fuente
serial
yCREATE SEQUENCE
es 1!)Ambas soluciones proporcionadas no funcionaron para mí;
setval('seq', 1)
comienza la numeración con 2 eALTER SEQUENCE seq START 1
inicia la numeración también con 2, porque seq.is_called es verdadero (Postgres versión 9.0.4)La solución que funcionó para mí es:
fuente
Solo para simplificar y aclarar el uso adecuado de ALTER SEQUENCE y SELECT setval para restablecer la secuencia:
es equivalente a
Cualquiera de las declaraciones puede usarse para restablecer la secuencia y puede obtener el siguiente valor mediante nextval ('nombre_secuencia') como se indica aquí también:
fuente
La mejor manera de restablecer una secuencia para comenzar de nuevo con el número 1 es ejecutar lo siguiente:
Entonces, por ejemplo para la tabla de usuarios sería:
fuente
Para retener el orden de las filas:
fuente
FYI: si necesita especificar un nuevo valor de inicio entre un rango de ID (256 - 10000000 por ejemplo):
fuente
Solo restablecer la secuencia y actualizar todas las filas puede causar errores de identificación duplicados. En muchos casos, debe actualizar todas las filas dos veces. Primero con identificadores más altos para evitar los duplicados, luego con los identificadores que realmente desea.
Evite agregar una cantidad fija a todos los identificadores (como se recomienda en otros comentarios). ¿Qué sucede si tiene más filas que esta cantidad fija? Suponiendo que el siguiente valor de la secuencia es más alto que todos los identificadores de las filas existentes (solo desea llenar los huecos), lo haría así:
fuente
En mi caso, logré esto con:
Donde mi mesa se llama mesa
fuente
Inspirado por las otras respuestas aquí, creé una función SQL para hacer una migración de secuencia. La función mueve una secuencia de teclas principal a una nueva secuencia contigua que comienza con cualquier valor (> = 1) dentro o fuera del rango de secuencia existente.
Explicaré aquí cómo utilicé esta función en una migración de dos bases de datos con el mismo esquema pero valores diferentes en una base de datos.
Primero, la función (que imprime los comandos SQL generados para que quede claro lo que realmente está sucediendo):
La función
migrate_pkey_sequence
toma los siguientes argumentos:arg_table
: nombre de la tabla (p'example'
. ej. )arg_column
: nombre de columna de clave principal (por ejemplo'id'
)arg_sequence
: nombre de secuencia (p'example_id_seq'
. ej. )arg_next_value
: siguiente valor para la columna después de la migraciónRealiza las siguientes operaciones:
nextval('example_id_seq')
siguemax(id)
y que la secuencia comienza con 1. Esto también maneja el caso dondearg_next_value > max(id)
.arg_next_value
. Se conserva el orden de los valores clave, pero no se conservan los agujeros en el rango.Para demostrarlo, utilizamos una secuencia y una tabla definidas de la siguiente manera (por ejemplo, usando
psql
):Luego, insertamos algunos valores (comenzando, por ejemplo, en 3):
Finalmente, migramos los
example.id
valores para comenzar con 1.El resultado:
fuente
Incluso la columna de incremento automático no es PK (en este ejemplo se llama seq, también conocida como secuencia), puede lograr eso con un disparador:
DROP TABLE IF EXISTS devops_guide CASCADE;
fuente
Si está utilizando pgAdmin3, expanda 'Secuencias', haga clic con el botón derecho en una secuencia, vaya a 'Propiedades' y en la pestaña 'Definición' cambie 'Valor actual' al valor que desee. No hay necesidad de una consulta.
fuente