PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostgreSQL JDBC getGeneratedKeys zwraca wszystkie kolumny

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. gem install pg --with-pg-config działa, pakiet nie działa

  2. Unikalne ograniczenie kombinacji dwóch kolumn?

  3. Klucz obcy w pierwszej tabeli

  4. order_by w polu Wiele do wielu powoduje zduplikowane wpisy w queryset

  5. Jak zaszyfrować kolumnę w Postgresie za pomocą Hibernate @ColumnTransformer