La plupart des pilotes prennent en charge getGeneratedKeys()
en collant un RETURNING
-clause à la fin de la requête avec les colonnes générées automatiquement. PostgreSQL renvoie tous les champs car il a RETURNING *
qui renvoie simplement toutes les colonnes. Cela signifie que pour renvoyer la clé générée, il n'est pas nécessaire d'interroger la table système pour déterminer la ou les colonnes à renvoyer, ce qui permet d'économiser des allers-retours réseau (et du temps de requête).
Ceci est implicitement autorisé par la spécification JDBC, car elle dit :
En lisant entre les lignes, vous pouvez dire que cela permet de dire "Je ne sais pas, ou c'est trop de travail, donc toutes les colonnes représentent au mieux les clés générées automatiquement" .
Une raison supplémentaire pourrait être qu'il est très difficile de déterminer quelles colonnes sont générées automatiquement et lesquelles ne le sont pas (je ne sais pas si cela est vrai pour PostgreSQL). Par exemple, dans Jaybird (le pilote JDBC pour Firebird que je maintiens), nous renvoyons également toutes les colonnes car dans Firebird, il est impossible de déterminer quelles colonnes sont générées automatiquement (mais nous devons interroger les tables système pour les noms de colonne car Firebird 3 et antérieures n'ont pas RETURNING *
).
Pour cela, il est toujours conseillé d'interroger explicitement les clés générées ResultSet
par nom de colonne et non par position.
D'autres solutions spécifient explicitement les noms de colonne ou les positions de colonne que vous souhaitez renvoyer à l'aide des méthodes alternatives acceptant un String[]
ou int[]
(bien que je ne sois pas sûr à 100 % de la manière dont le pilote PostgreSQL gère cela).
BTW :Oracle est (était ?) encore pire :par défaut, il renvoie le ROW_ID
de la ligne, et vous devez utiliser une requête distincte pour obtenir les valeurs (générées) de cette ligne.