PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL JDBC getGeneratedKeys gibt alle Spalten zurück

Die meisten Treiber unterstützen getGeneratedKeys() durch Anheften eines RETURNING -Klausel am Ende der Abfrage mit den automatisch generierten Spalten. PostgreSQL gibt alle Felder zurück, weil es RETURNING * hat die einfach alle Spalten zurückgibt. Das bedeutet, dass zum Zurückgeben des generierten Schlüssels nicht die Systemtabelle abgefragt werden muss, um zu bestimmen, welche Spalte(n) zurückgegeben werden sollen, und dies spart Netzwerk-Roundtrips (und Abfragezeit).

Dies wird von der JDBC-Spezifikation implizit zugelassen, da es sagt :

Wenn Sie zwischen den Zeilen lesen, können Sie sagen, dass dies erlaubt zu sagen 'Ich weiß nicht, oder es ist zu viel Arbeit, also repräsentieren alle Spalten am besten die automatisch generierten Schlüssel' .

Ein weiterer Grund könnte sein, dass es sehr schwer zu bestimmen ist, welche Spalten automatisch generiert werden und welche nicht (ich bin mir nicht sicher, ob das für PostgreSQL gilt). Zum Beispiel geben wir in Jaybird (dem JDBC-Treiber für Firebird, den ich pflege) auch alle Spalten zurück, weil es in Firebird unmöglich ist, festzustellen, welche Spalten automatisch generiert werden (aber wir müssen die Systemtabellen nach den Spaltennamen abfragen, weil Firebird 3 und früher haben kein RETURNING * ).

Daher ist es immer ratsam, die generierten Schlüssel ResultSet explizit abzufragen nach Spaltenname und nicht nach Position.

Andere Lösungen geben explizit die Spaltennamen oder Spaltenpositionen an, die Sie zurückgeben möchten, indem Sie alternative Methoden verwenden, die ein String[] oder int[] (obwohl ich mir nicht 100 % sicher bin, wie der PostgreSQL-Treiber damit umgeht).

Übrigens:Oracle ist (war?) noch schlimmer:standardmäßig gibt es die ROW_ID zurück der Zeile, und Sie müssen eine separate Abfrage verwenden, um die (erzeugten) Werte aus dieser Zeile abzurufen.