sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL JDBC getGeneratedKeys returnerer alle kolonner

De fleste drivere understøtter getGeneratedKeys() ved at slå på en RETURNING -klausul i slutningen af ​​forespørgslen med de kolonner, der er automatisk genereret. PostgreSQL returnerer alle felter, fordi den har RETURNING * som blot returnerer alle kolonner. Det betyder, at for at returnere den genererede nøgle, behøver den ikke at forespørge i systemtabellen for at bestemme, hvilke(n) kolonne(r) der skal returneres, og dette sparer netværksrundture (og forespørgselstid).

Dette er implicit tilladt af JDBC-specifikationen, fordi det siger :

Når du læser mellem linjerne, kan du sige, at dette giver mulighed for at sige 'Jeg ved det ikke, eller det er for meget arbejde, så alle kolonner repræsenterer bedst de autogenererede nøgler' .

En yderligere grund kan være, at det er meget svært at afgøre, hvilke kolonner der er automatisk genereret, og hvilke der ikke er (jeg er ikke sikker på, om det er sandt for PostgreSQL). For eksempel returnerer vi i Jaybird (JDBC-driveren til Firebird, som jeg vedligeholder) også alle kolonner, fordi det i Firebird er umuligt at bestemme, hvilke kolonner der er automatisk genereret (men vi er nødt til at forespørge systemtabellerne for kolonnenavnene, fordi Firebird 3 og tidligere har ikke RETURNING * ).

Derfor er det altid tilrådeligt eksplicit at forespørge på de genererede nøgler ResultSet efter kolonnenavn og ikke efter position.

Andre løsninger er eksplicit at angive kolonnenavnene eller de kolonnepositioner, du ønsker returneret ved hjælp af de alternative metoder, der accepterer en String[] eller int[] (selvom jeg ikke er 100 % sikker på, hvordan PostgreSQL-driveren håndterer det).

BTW:Oracle er (var?) endnu værre:som standard returnerer det ROW_ID af rækken, og du skal bruge en separat forespørgsel for at få de (genererede) værdier fra den række.



  1. SQL-kommando ikke afsluttet korrekt Undtagelse

  2. Sådan udføres dtsx-pakker via kommandolinjen

  3. Sådan konverteres MAIN mysql-database til InnoDB fra MyIsam

  4. SQL Indsæt række og kopier indsat Auto-Increment id til en anden kolonne