PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

PostgreSQL JDBC getGeneratedKeys trả về tất cả các cột

Hầu hết các trình điều khiển đều hỗ trợ getGeneratedKeys() bằng cách đặt trên một RETURNING -clause ở cuối truy vấn với các cột được tạo tự động. PostgreSQL trả về tất cả các trường vì nó có RETURNING * mà chỉ trả về tất cả các cột. Điều đó có nghĩa là để trả lại khóa đã tạo, nó không phải truy vấn bảng hệ thống để xác định (các) cột nào cần trả lại và điều này giúp tiết kiệm các vòng lặp mạng (và thời gian truy vấn).

Điều này được đặc tả JDBC ngầm cho phép vì nó nói :

Đọc giữa các dòng, bạn có thể nói rằng điều này cho phép nói 'Tôi không biết, hoặc quá nhiều việc, vì vậy tất cả các cột thể hiện tốt nhất các khóa được tạo tự động' .

Một lý do bổ sung có thể là rất khó xác định cột nào được tạo tự động và cột nào không (tôi không chắc liệu điều đó có đúng với PostgreSQL hay không). Ví dụ:trong Jaybird (trình điều khiển JDBC cho Firebird mà tôi duy trì), chúng tôi cũng trả về tất cả các cột vì trong Firebird không thể xác định cột nào được tạo tự động (nhưng chúng tôi cần truy vấn bảng hệ thống cho tên cột vì Firebird 3 và trước đó không có RETURNING * ).

Vì vậy, bạn nên truy vấn rõ ràng các khóa được tạo ResultSet theo tên cột chứ không phải theo vị trí.

Các giải pháp khác đang chỉ định rõ ràng tên cột hoặc vị trí cột bạn muốn trả về bằng các phương thức thay thế chấp nhận String[] hoặc int[] (mặc dù tôi không chắc chắn 100% cách trình điều khiển PostgreSQL xử lý điều đó).

BTW:Oracle thậm chí còn tệ hơn:theo mặc định, nó trả về ROW_ID của hàng và bạn cần sử dụng một truy vấn riêng để nhận các giá trị (được tạo) từ hàng đó.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql k-láng giềng gần nhất (KNN) trên khối lập phương đa chiều

  2. Docker - Ứng dụng Rails không thể kết nối với vùng chứa Postgres được liên kết (dường như không chạy)

  3. SQLAlchemy có hàm tổng hợp bool_and không?

  4. Làm cách nào để tự động cập nhật dấu thời gian trong PostgreSQL

  5. Tại sao điều kiện CROSS JOIN không hoạt động trong mệnh đề 'ON', chỉ có mệnh đề WHERE?