versiones guia español actualizar postgresql insert sql-returning

postgresql - guia - ¿INSERT RETURNING está garantizado para devolver las cosas en el orden "correcto"?



qgis español (3)

Ejemplo:

create table foo( id serial, txt text ); insert into foo(txt) values (''a''),(''b''),(''c'') returning id;

Devoluciones:

id ---- 1 2 3 (3 rows)

Parece que la primera id en el valor de retorno siempre será la id para ''a'' , la segunda para ''b'' y así sucesivamente, pero ¿este comportamiento definido de insert into , o es una coincidencia que puede fallar en circunstancias extrañas? ?


Si bien la documentación no es del todo clara, sí establece que:

Si el comando INSERT contiene una cláusula RETURNING, el resultado será similar al de una instrucción SELECT que contenga las columnas y los valores definidos en la lista RETURNING, calculados sobre la (s) fila (s) insertadas por el comando.

Ahora, "similar a" no es una garantía real, y lo he planteado para discusión en la lista de correo ... pero en la práctica, PostgreSQL no interferirá con el orden de los valores en el RETURNING . Es poco probable que alguna vez podamos, incluso si queremos para la optimización, porque demasiadas aplicaciones dependen de que se solicite lo mismo que la entrada.

Entonces ... para INSERT INTO ... VALUES (...), (...), ... RETURNING ... y para INSERT INTO ... SELECT ... ORDER BY ... RETURNING ... debería ser seguro suponer que la relación de resultados está en el mismo orden que la entrada.


No veo nada en la documentación que garantice un pedido de RETURNING así que no creo que pueda confiar en ello. Lo más probable es que el orden de RETURNING coincida con el orden de VALUES , pero no veo ninguna garantía sobre el orden en que se insertarán los VALUES ; los VALUES casi seguramente se insertarán en orden de izquierda a derecha, pero nuevamente, no hay garantía documentada.

Además, el modelo relacional se establece en función de que ordenar es algo que el usuario aplica en lugar de una propiedad inherente de una relación. En general, si no hay forma de especificar explícitamente un pedido, no hay ordenamiento implícito.

Ejecutar resumen: el orden que estás viendo es probablemente lo que siempre sucederá, pero no está garantizado, así que no dependas de él.


Si bien esto no lo ayudará ahora , 9.1 incluirá "expresiones de tabla común grabables" . Ese es el nombre oficial de la sintaxis WITH . ( Wikipedia )

Esta nueva habilidad debería permitirle colocar su INSERT ... RETURNING dentro de un WITH , dar un alias, y luego SELECT contra eso con un orden específico con una cláusula ORDER BY simple.