La maggior parte dei driver supporta getGeneratedKeys()
virando su un RETURNING
-clausola alla fine della query con le colonne che vengono generate automaticamente. PostgreSQL restituisce tutti i campi perché ha RETURNING *
che restituisce semplicemente tutte le colonne. Ciò significa che per restituire la chiave generata non è necessario interrogare la tabella di sistema per determinare quali colonne restituire e ciò consente di risparmiare i roundtrip di rete (e il tempo di query).
Ciò è implicitamente consentito dalla specifica JDBC, perché dice :
Leggendo tra le righe puoi dire che questo permette di dire 'Non lo so, o è troppo lavoro, quindi tutte le colonne rappresentano al meglio le chiavi generate automaticamente' .
Un ulteriore motivo potrebbe essere che è molto difficile determinare quali colonne vengono generate automaticamente e quali no (non sono sicuro che sia vero per PostgreSQL). Ad esempio in Jaybird (il driver JDBC per Firebird che mantengo) restituiamo anche tutte le colonne perché in Firebird è impossibile determinare quali colonne vengono generate automaticamente (ma dobbiamo interrogare le tabelle di sistema per i nomi delle colonne perché Firebird 3 e precedenti non hanno RETURNING *
).
Pertanto è sempre consigliabile interrogare esplicitamente le chiavi generate ResultSet
per nome della colonna e non per posizione.
Altre soluzioni specificano esplicitamente i nomi delle colonne o le posizioni delle colonne che si desidera restituire utilizzando i metodi alternativi accettando un String[]
o int[]
(anche se non sono sicuro al 100% di come il driver PostgreSQL lo gestisca).
A proposito:Oracle è (era?) anche peggio:per impostazione predefinita restituisce il ROW_ID
della riga ed è necessario utilizzare una query separata per ottenere i valori (generati) da quella riga.