sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL JDBC getGeneratedKeys devuelve todas las columnas

La mayoría de los controladores admiten getGeneratedKeys() agregando un RETURNING -cláusula al final de la consulta con las columnas que se generan automáticamente. PostgreSQL devuelve todos los campos porque tiene RETURNING * que simplemente devuelve todas las columnas. Eso significa que para devolver la clave generada no es necesario consultar la tabla del sistema para determinar qué columna(s) devolver, y esto ahorra viajes de ida y vuelta en la red (y tiempo de consulta).

Esto está implícitamente permitido por la especificación JDBC, porque dice :

Leyendo entre líneas, puede decir que esto permite decir 'No sé, o es demasiado trabajo, por lo que todas las columnas representan mejor las claves generadas automáticamente' .

Una razón adicional podría ser que es muy difícil determinar qué columnas se generan automáticamente y cuáles no (no estoy seguro de si eso es cierto para PostgreSQL). Por ejemplo, en Jaybird (el controlador JDBC para Firebird que mantengo) también devolvemos todas las columnas porque en Firebird es imposible determinar qué columnas se generan automáticamente (pero necesitamos consultar las tablas del sistema para los nombres de las columnas porque Firebird 3 y anteriores no tienen RETURNING * ).

Por lo tanto, siempre es recomendable consultar explícitamente las claves generadas ResultSet por nombre de columna y no por posición.

Otras soluciones especifican explícitamente los nombres de las columnas o las posiciones de las columnas que desea devolver utilizando los métodos alternativos que aceptan un String[] o int[] (aunque no estoy 100 % seguro de cómo maneja eso el controlador PostgreSQL).

Por cierto:Oracle es (¿era?) Aún peor:por defecto devuelve el ROW_ID de la fila, y necesita usar una consulta separada para obtener los valores (generados) de esa fila.