De flesta drivrutiner stöder getGeneratedKeys()
genom att slå på en RETURNING
-klausul i slutet av frågan med kolumnerna som genereras automatiskt. PostgreSQL returnerar alla fält eftersom den har RETURNING *
vilket helt enkelt returnerar alla kolumner. Det betyder att för att returnera den genererade nyckeln behöver den inte fråga systemtabellen för att avgöra vilken eller vilka kolumner som ska returneras, och detta sparar nätverksresor (och frågetid).
Detta är implicit tillåtet av JDBC-specifikationen, eftersom det säger :
När du läser mellan raderna kan du säga att detta gör det möjligt att säga 'Jag vet inte, eller så är det för mycket arbete, så alla kolumner representerar bäst de automatiskt genererade nycklarna' .
En ytterligare anledning kan vara att det är väldigt svårt att avgöra vilka kolumner som genereras automatiskt och vilka som inte är det (jag är inte säker på om det är sant för PostgreSQL). Till exempel i Jaybird (JDBC-drivrutinen för Firebird som jag underhåller) returnerar vi också alla kolumner eftersom det i Firebird är omöjligt att avgöra vilka kolumner som är automatiskt genererade (men vi behöver fråga systemtabellerna för kolumnnamnen eftersom Firebird 3 och tidigare har inte RETURNING *
).
Därför är det alltid tillrådligt att explicit fråga de genererade nycklarna ResultSet
efter kolumnnamn och inte efter position.
Andra lösningar är att uttryckligen specificera kolumnnamnen eller kolumnpositionerna du vill ha returnerat med de alternativa metoderna som accepterar en String[]
eller int[]
(även om jag inte är 100% säker på hur PostgreSQL-drivrutinen hanterar det).
BTW:Oracle är (var?) ännu värre:som standard returnerar det ROW_ID
av raden, och du måste använda en separat fråga för att få de (genererade) värdena från den raden.