Sebagian besar driver mendukung getGeneratedKeys()
dengan menempelkan RETURNING
-klausa di akhir kueri dengan kolom yang dibuat secara otomatis. PostgreSQL mengembalikan semua bidang karena memiliki RETURNING *
yang hanya mengembalikan semua kolom. Itu berarti bahwa untuk mengembalikan kunci yang dihasilkan, tidak perlu mengkueri tabel sistem untuk menentukan kolom mana yang akan dikembalikan, dan ini menghemat perjalanan pulang pergi jaringan (dan waktu kueri).
Ini secara implisit diizinkan oleh spesifikasi JDBC, karena mengatakan :
Membaca yang tersirat, Anda dapat mengatakan bahwa ini memungkinkan untuk mengatakan 'Saya tidak tahu, atau terlalu banyak pekerjaan, jadi semua kolom paling baik mewakili kunci yang dibuat secara otomatis' .
Alasan tambahan mungkin karena sangat sulit untuk menentukan kolom mana yang dibuat secara otomatis dan mana yang tidak (saya tidak yakin apakah itu benar untuk PostgreSQL). Misalnya di Jaybird (driver JDBC untuk Firebird yang saya pertahankan) kami juga mengembalikan semua kolom karena di Firebird tidak mungkin menentukan kolom mana yang dibuat secara otomatis (tetapi kami perlu menanyakan tabel sistem untuk nama kolom karena Firebird 3 dan sebelumnya tidak memiliki RETURNING *
).
Oleh karena itu, selalu disarankan untuk secara eksplisit menanyakan kunci yang dihasilkan ResultSet
berdasarkan nama kolom dan bukan berdasarkan posisi.
Solusi lain secara eksplisit menentukan nama kolom atau posisi kolom yang ingin Anda kembalikan menggunakan metode alternatif yang menerima String[]
atau int[]
(walaupun saya tidak 100% yakin bagaimana driver PostgreSQL menanganinya).
BTW:Oracle (apakah?) bahkan lebih buruk:secara default ia mengembalikan ROW_ID
baris, dan Anda perlu menggunakan kueri terpisah untuk mendapatkan nilai (yang dihasilkan) dari baris tersebut.