PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL JDBC getGeneratedKeys restituisce tutte le colonne

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.