¿Postgres conserva el orden de inserción de los registros?

19

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
Sergey
fuente
44
Dejando a un lado la respuesta real (que creo que es no), no debe confiar en ningún otro orden que el que especifique en sus consultas.
dezso

Respuestas:

17

La respuesta para este simple caso es . Las filas se insertan en el orden proporcionado en la VALUESexpresión. Y si su idcolumna es un serialtipo, 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 WHEREcondiciones 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 columnactid del sistema ) corresponderá inicialmente a su orden insertado, eso puede cambiar en cualquier momento. UPDATE, DELETE, VACUUMY otros comandos pueden cambiar el orden físico de las filas. Pero los valores generados para idson estables y no están conectados de ninguna manera, por supuesto.

Erwin Brandstetter
fuente
Creo que Sergey se refería más a la pregunta de si la primera fila siempre obtendrá id = 1, la segunda id = 2 y la tercera id = 3 - no el "orden" real o las filas
a_horse_with_no_name
@a_horse_with_no_name: Para responder eso : será el caso con una serialcolumna recién creada , idealmente en la misma transacción.
Erwin Brandstetter
Si la pregunta es "¿la identificación de name3 siempre será más grande que la de name1", entonces sería siempre correcta? (Con respecto a su segundo párrafo)
lulalala
@lulalala: No necesariamente para consultas más complejas con combinaciones y WHEREcondiciones. Si bien no puedo pensar en WHEREcondiciones simples que cambiarían el orden de las filas, las uniones ciertamente pueden hacerlo.
Erwin Brandstetter
3

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 el SELECT 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.

usuario2052675
fuente
3
Como @Erwin señaló en la primera oración , solo está diciendo "sí" en esa instancia particular en particular mencionada en la pregunta. Como @deszo dijo en su comentario , nunca confíe en el orden de "inserción"; siempre debe especificar el orden en la instrucción select si confía en ese orden para cualquier propósito.
Max Vernon