Повечето драйвери поддържат getGeneratedKeys()
чрез закрепване на RETURNING
-клауза в края на заявката с колоните, които се генерират автоматично. PostgreSQL връща всички полета, защото има RETURNING *
който просто връща всички колони. Това означава, че за да се върне генерираният ключ, не е необходимо да се прави запитване до системната таблица, за да се определи коя(и) колона(и) да се върнат, и това спестява обиколки на мрежата (и време за заявки).
Това имплицитно се допуска от JDBC спецификацията, защото казва :
Четейки между редовете, можете да кажете, че това позволява да кажете „Не знам или е твърде много работа, така че всички колони най-добре представят автоматично генерираните ключове“ .
Допълнителна причина може да е, че е много трудно да се определи кои колони са автоматично генерирани и кои не (не съм сигурен дали това е вярно за PostgreSQL). Например в Jaybird (JDBC драйверът за Firebird, който поддържам) ние също връщаме всички колони, защото във Firebird е невъзможно да се определи кои колони са автоматично генерирани (но трябва да направим запитване към системните таблици за имената на колоните, защото Firebird 3 и по-ранни нямат RETURNING *
).
Поради това винаги е препоръчително изрично да правите заявки за генерираните ключове ResultSet
по име на колона, а не по позиция.
Други решения изрично посочват имената на колоните или позициите на колоните, които искате да бъдат върнати, като използват алтернативните методи, приемащи String[]
или int[]
(въпреки че не съм 100% сигурен как драйверът на PostgreSQL се справя с това).
Между другото:Oracle е (беше?) още по-лош:по подразбиране връща ROW_ID
на реда и трябва да използвате отделна заявка, за да получите (генерираните) стойности от този ред.