sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL JDBC getGeneratedKeys vrátí všechny sloupce

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.



  1. Nejlepší způsoby, jak zvýšit efektivitu databáze

  2. Jak opravit chybu Msg 7325 na serveru SQL Server:„Objekty odhalující sloupce s typy CLR nejsou povoleny v distribuovaných dotazech“

  3. Vytvořte vypočítaný sloupec pomocí dat z jiné tabulky

  4. SQL určit minimální sekvenční dny přístupu?