Por exemplo, quando estou usando uma consulta que retorna IDs de registro
INSERT INTO projects(name)
VALUES (name1), (name2), (name3) returning id;
Quais produzem saída:
1
2
3
Esses IDs apontarão para os valores inseridos correspondentes?
1 -> name1
2 -> name2
3 -> name3
postgresql
insert
order-by
postgresql-9.4
Sergey
fonte
fonte
Respostas:
A resposta para este caso simples é Sim . As linhas são inseridas na ordem fornecida no
VALUES
expressão. E se suaid
coluna for umserial
tipo, os valores da sequência subjacente serão buscados nessa ordem.Mas este é um detalhe de implementação e não há garantias. Em particular, o pedido não é necessariamente mantido em consultas mais complexas com
WHERE
condições ou junções.Você também pode obter intervalos 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 (refletida na coluna
ctid
do sistema ) corresponda inicialmente à ordem inserida, isso pode mudar a qualquer momento.UPDATE
,DELETE
,VACUUM
E outros comandos pode mudar a ordem física das linhas. Mas os valores gerados paraid
são estáveis e de forma alguma conectados a isso, é claro.fonte
serial
coluna recém-criada - idealmente na mesma transação.WHERE
condições. Embora eu não consiga pensar emWHERE
condições simples que alterariam a ordem das linhas, as junções certamente podem fazer isso.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 que issoSELECT 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. O truncamento experimental dos dados jsonb durante a inserção fez com que a ordem da inserção estivesse correta.fonte