Por exemplo, quando estou usando a consulta que retorna IDs de registro
INSERT INTO projects(name)
VALUES (name1), (name2), (name3) returning id;
Que produzem saída:
1
2
3
Esse ID apontará para os valores inseridos correspondentes?
1 -> name1
2 -> name2
3 -> name3
A resposta para este caso simples é: "Sim" . As linhas são inseridas na ordem fornecida na
VALUES
expressão. E se suaid
coluna for umserial
tipo, os valores da sequência subjacente serão buscados nessa ordem.Mas isso é um detalhe de implementação e não há garantias. Em particular, a ordem não é necessariamente mantida em consultas mais complexas com
WHERE
condições ou junções.Você também pode obter lacunas ou outras linhas misturadas se tiver transações simultâneas gravando na mesma tabela ao mesmo tempo. Improvável, mas possível.
Não há ordem "natural" em uma tabela de banco de dados. Embora a ordem física das linhas (que é refletida na coluna do sistema
ctid
) corresponda à ordem inserida inicialmente, isso pode mudar a qualquer momento.UPDATE
,DELETE
eVACUUM
outros comandos podem alterar a ordem física das linhas. ParaSELECT
linhas em qualquer ordem específica, você deve adicionar umaORDER BY
cláusula. Os valores paraid
, uma vez gerados, são estáveis e desacoplados de qualquer ordem física, é claro.A resposta de Erwin Brandstetter pode não estar correta em um determinado caso.
Fizemos um
INSERT INTO ... SELECT bar,baz FROM foo ORDER BY bar
e vemos queSELECT ctid,* FROM foo
mostra que a ordem física das linhas na tabela não corresponde exatamente à ordem de inserção, parece um pouco embaralhada. Observe que nossa tabela possui uma coluna jsonb com tamanho de dados altamente variável. Truncar experimentalmente os dados jsonb durante a inserção fez com que a ordem de inserção estivesse correta.