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
VALUESexpresión. Y si suidcolumna es unserialtipo, 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 columna
ctiddel 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 paraidson estables y no están conectados de ninguna manera, por supuesto.fuente
serialcolumna recién creada , idealmente en la misma transacción.WHEREcondiciones. Si bien no puedo pensar enWHEREcondiciones 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 bary vemos que elSELECT ctid,* FROM fooprograma 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