Většina ovladačů podporuje getGeneratedKeys()
připnutím na RETURNING
-klauzule na konci dotazu se sloupci, které se generují automaticky. PostgreSQL vrací všechna pole, protože má RETURNING *
který jednoduše vrátí všechny sloupce. To znamená, že pro vrácení vygenerovaného klíče není nutné dotazovat se na systémovou tabulku, aby určoval, které sloupce se mají vrátit, a to šetří zpáteční cesty sítě (a čas dotazování).
To je implicitně povoleno specifikací JDBC, protože říká :
Čtením mezi řádky můžete říci, že to umožňuje říci „Nevím, nebo je to příliš mnoho práce, takže všechny sloupce nejlépe představují automaticky generované klíče“ .
Dalším důvodem může být, že je velmi obtížné určit, které sloupce jsou automaticky generovány a které ne (nejsem si jistý, zda to platí pro PostgreSQL). Například v Jaybirdu (ovladač JDBC pro Firebird, který spravuji) také vracíme všechny sloupce, protože ve Firebirdu není možné určit, které sloupce jsou automaticky generovány (ale musíme se ptát na názvy sloupců v systémových tabulkách, protože Firebird 3 a starší nemají RETURNING *
).
Proto je vždy vhodné explicitně dotazovat vygenerované klíče ResultSet
podle názvu sloupce a ne podle pozice.
Jiná řešení explicitně určují názvy sloupců nebo pozice sloupců, které chcete vrátit, pomocí alternativních metod akceptujících String[]
nebo int[]
(ačkoli si nejsem 100% jistý, jak to ovladač PostgreSQL zvládá).
BTW:Oracle je (byl?) ještě horší:ve výchozím nastavení vrací ROW_ID
řádku a k získání (vygenerovaných) hodnot z tohoto řádku musíte použít samostatný dotaz.