Por ejemplo, cuando estoy usando una consulta que devuelve identificadores de registro
INSERT INTO projects(name)
VALUES (name1), (name2), (name3) returning id;
Que producen salida:
1
2
3
¿Estos identificadores apuntarán a los valores insertados correspondientes?
1 -> name1
2 -> name2
3 -> name3
postgresql
insert
order-by
postgresql-9.4
Sergey
fuente
fuente
Respuestas:
La respuesta para este simple caso es sí . Las filas se insertan en el orden proporcionado en la
VALUES
expresión. Y si suid
columna es unserial
tipo, los valores de la secuencia subyacente se buscarán en ese orden.Pero este es un detalle de implementación y no hay garantías. En particular, el orden no se mantiene necesariamente en consultas más complejas con
WHERE
condiciones o combinaciones.También puede obtener huecos u otras filas mezcladas si tiene transacciones simultáneas escribiendo en la misma tabla al mismo tiempo. Improbable, pero posible.
No hay un orden "natural" en una tabla de base de datos. Si bien el orden físico de las filas (que se refleja en la columna
ctid
del sistema ) corresponderá inicialmente a su orden insertado, eso puede cambiar en cualquier momento.UPDATE
,DELETE
,VACUUM
Y otros comandos pueden cambiar el orden físico de las filas. Pero los valores generados paraid
son estables y no están conectados de ninguna manera, por supuesto.fuente
serial
columna recién creada , idealmente en la misma transacción.WHERE
condiciones. Si bien no puedo pensar enWHERE
condiciones simples que cambiarían el orden de las filas, las uniones ciertamente pueden hacerlo.La respuesta de Erwin Brandstetter puede no ser correcta en cierto caso.
Hemos hecho un
INSERT INTO ... SELECT bar,baz FROM foo ORDER BY bar
y vemos que elSELECT ctid,* FROM foo
programa muestra que el orden físico de las filas en la tabla no coincide exactamente con el orden de inserción, parece un poco revuelto. Tenga en cuenta que nuestra tabla tiene una columna jsonb con un tamaño de datos muy variable. Truncar experimentalmente los datos de jsonb durante la inserción hizo que el orden de inserción fuera correcto.fuente