Większość sterowników obsługuje getGeneratedKeys()
zaznaczając RETURNING
-klauzula na końcu zapytania z kolumnami, które są generowane automatycznie. PostgreSQL zwraca wszystkie pola, ponieważ ma RETURNING *
który po prostu zwraca wszystkie kolumny. Oznacza to, że aby zwrócić wygenerowany klucz, nie trzeba wysyłać zapytań do tabeli systemowej, aby określić, które kolumny mają zostać zwrócone, a to oszczędza sieci (i czas wykonywania zapytań).
Jest to domyślnie dozwolone przez specyfikację JDBC, ponieważ mówi :
Czytając między wierszami, można powiedzieć, że pozwala to na powiedzenie „Nie wiem lub jest to za dużo pracy, więc wszystkie kolumny najlepiej reprezentują klucze wygenerowane automatycznie” .
Dodatkowym powodem może być to, że bardzo trudno jest określić, które kolumny są generowane automatycznie, a które nie (nie jestem pewien, czy tak jest w przypadku PostgreSQL). Na przykład w Jaybird (sterownik JDBC dla Firebirda, który utrzymuję) zwracamy również wszystkie kolumny, ponieważ w Firebird nie można określić, które kolumny są generowane automatycznie (ale musimy odpytywać tabele systemowe o nazwy kolumn, ponieważ Firebird 3 i wcześniej nie mają RETURNING *
).
Dlatego zawsze zaleca się jawne zapytanie o wygenerowane klucze ResultSet
według nazwy kolumny, a nie według pozycji.
Inne rozwiązania wyraźnie określają nazwy kolumn lub pozycje kolumn, które mają zostać zwrócone przy użyciu alternatywnych metod akceptujących String[]
lub int[]
(chociaż nie jestem w 100% pewien, jak radzi sobie z tym sterownik PostgreSQL).
BTW:Oracle jest (było?) jeszcze gorsze:domyślnie zwraca ROW_ID
wiersza i musisz użyć oddzielnego zapytania, aby uzyskać (wygenerowane) wartości z tego wiersza.