sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL JDBC getGeneratedKeys retourneert alle kolommen

De meeste stuurprogramma's ondersteunen getGeneratedKeys() door overstag te gaan op een RETURNING -clause aan het einde van de query met de kolommen die automatisch worden gegenereerd. PostgreSQL retourneert alle velden omdat het RETURNING * . heeft die eenvoudig alle kolommen retourneert. Dat betekent dat om de gegenereerde sleutel te retourneren, het niet de systeemtabel hoeft te doorzoeken om te bepalen welke kolom(men) moeten worden geretourneerd, en dit bespaart netwerk-roundtrips (en querytijd).

Dit is impliciet toegestaan ​​door de JDBC-specificatie, omdat het zegt :

Als je tussen de regels door leest, kun je zeggen dat dit het mogelijk maakt om 'Ik weet het niet, of het is te veel werk, dus alle kolommen vertegenwoordigen het best de automatisch gegenereerde sleutels' .

Een extra reden kan zijn dat het erg moeilijk is om te bepalen welke kolommen automatisch worden gegenereerd en welke niet (ik weet niet zeker of dat waar is voor PostgreSQL). Bijvoorbeeld in Jaybird (het JDBC-stuurprogramma voor Firebird dat ik onderhoud) retourneren we ook alle kolommen omdat het in Firebird onmogelijk is om te bepalen welke kolommen automatisch worden gegenereerd (maar we moeten de systeemtabellen wel opvragen voor de kolomnamen omdat Firebird 3 en eerder hebben geen RETURNING * ).

Daarom is het altijd raadzaam om expliciet de gegenereerde sleutels ResultSet . op te vragen op kolomnaam en niet op positie.

Andere oplossingen zijn het expliciet specificeren van de kolomnamen of de kolomposities die u wilt retourneren met behulp van de alternatieve methoden die een String[] of int[] (hoewel ik niet 100% zeker weet hoe de PostgreSQL-driver daarmee omgaat).

Trouwens:Oracle is (was?) nog erger:standaard retourneert het de ROW_ID van de rij, en u moet een aparte query gebruiken om de (gegenereerde) waarden uit die rij te halen.



  1. mysql toont beschikbare tijdvakken en tijdvakken bezet vanaf tafel

  2. php mysql_insert_id(); werkt niet

  3. Rails actieve recordquery voor het ophalen van de meest voorkomende objecten

  4. mysql selecteer verschillende rijen in een door komma's gescheiden lijstkolom