PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL JDBC getGeneratedKeys retorna todas as colunas


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.