A maioria dos drivers suporta
getGeneratedKeys()
ao adicionar um RETURNING
-clause no final da consulta com as colunas que são geradas automaticamente. PostgreSQL retorna todos os campos porque tem RETURNING *
que simplesmente retorna todas as colunas. Isso significa que, para retornar a chave gerada, não é necessário consultar a tabela do sistema para determinar qual(is) coluna(s) retornar, e isso economiza viagens de ida e volta da rede (e tempo de consulta). Isso é permitido implicitamente pela especificação JDBC, porque diz :
Lendo nas entrelinhas, você pode dizer que isso permite dizer 'Não sei, ou é muito trabalho, então todas as colunas representam melhor as chaves geradas automaticamente' .
Uma razão adicional pode ser que é muito difícil determinar quais colunas são geradas automaticamente e quais não são (não tenho certeza se isso é verdade para o PostgreSQL). Por exemplo, no Jaybird (o driver JDBC para Firebird que mantenho) também retornamos todas as colunas porque no Firebird é impossível determinar quais colunas são geradas automaticamente (mas precisamos consultar as tabelas do sistema para os nomes das colunas porque o Firebird 3 e anteriores não têm
RETURNING *
). Portanto, é sempre aconselhável consultar explicitamente as chaves geradas
ResultSet
pelo nome da coluna e não pela posição. Outras soluções especificam explicitamente os nomes das colunas ou as posições das colunas que você deseja retornar usando os métodos alternativos que aceitam um
String[]
ou int[]
(embora eu não tenha 100% de certeza de como o driver PostgreSQL lida com isso). BTW:Oracle é (era?) ainda pior:por padrão, ele retorna o
ROW_ID
da linha e você precisa usar uma consulta separada para obter os valores (gerados) dessa linha.