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

Giá trị tham chiếu của cột nối tiếp trong một cột khác trong cùng một INSERT

Bạn có thể sử dụng CTE để truy xuất giá trị từ chuỗi một lần và sử dụng nó nhiều lần :

WITH cte AS (
   SELECT nextval('foo_id_seq') AS id
   )
INSERT INTO foo (id, ltree)
SELECT id, '1.' || id
FROM   cte;

CTE với lệnh sửa đổi dữ liệu yêu cầu Postgres 9.1 trở lên.

Nếu bạn không chắc về tên của chuỗi, hãy sử dụng pg_get_serial_sequence() thay vào đó:

WITH i AS (
   SELECT nextval(pg_get_serial_sequence('foo', 'id')) AS id
   )
INSERT INTO foo (id, ltree)
SELECT id, '1.' || id
FROM   i;

Nếu tên bảng "foo" có thể không phải là duy nhất trên tất cả các lược đồ trong DB, hãy xác định điều kiện cho nó. Và nếu cách viết của bất kỳ tên nào không chuẩn, bạn phải đặt dấu ngoặc kép:

pg_get_serial_sequence('"My_odd_Schema".foo', 'id')


Các bài kiểm tra nhanh chỉ ra ý tưởng của @ Mark với lastval() might cũng làm việc:

INSERT INTO foo (ltree) VALUES ('1.' || lastval());
  • Bạn chỉ có thể để lại id ra khỏi truy vấn, serial cột sẽ được chỉ định tự động. Không có gì khác biệt.

  • Không nên có điều kiện chạy đua giữa các hàng. Tôi trích dẫn sách hướng dẫn:

currval

Trả lại giá trị mà nextval thu được gần đây nhất cho trình tự này trong phiên hiện tại. (Lỗi được thông báo nếu nextval chưa bao giờ được gọi cho trình tự này trong phiên này.) Vì điều này quay trở lại giá trị cục bộ của phiên, nó đưa ra câu trả lời có thể dự đoán được trong trường hợp không phải phiên khác đã thực thi nextval kể từ sessiondid hiện tại.

Chức năng này yêu cầu USAGE hoặc SELECT đặc quyền trên trình tự.

lastval

Trả lại giá trị được trả về gần đây nhất bởi nextval trong phiên hiện tại. Hàm này giống với currval , ngoại trừ thay vì sử dụng tên trình tự làm đối số, nó tham chiếu đến bất kỳ thứ tự nào nextval đã được áp dụng gần đây nhất cho trong phiên hiện tại. Có lỗi khi gọi lastval if nextval vẫn chưa được gọi trong phiên hiện tại.

Chức năng này yêu cầu USAGE hoặc SELECT đặc quyền trên chuỗi được sử dụng cuối cùng.

Nhấn mạnh đậm của tôi.

Nhưng , như @Bernard đã nhận xét, nó có thể bị lỗi sau cùng:không có gì đảm bảo rằng giá trị mặc định được lấp đầy (và nextval() được gọi trong quá trình này) trước lastval() được gọi để điền vào cột thứ 2 ltree . Vì vậy, hãy gắn bó với giải pháp đầu tiên và nextval() chắc chắn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách thoát ký tự dấu chấm hỏi (?) Với Spring JpaRepository

  2. Mẫu &Công cụ sửa đổi Mẫu cho Định dạng Ngày / Giờ trong PostgreSQL

  3. Thêm một cột làm khóa ngoại thì cột LỖI được tham chiếu trong ràng buộc khóa ngoại không tồn tại

  4. Kiểm tra Go song song được thực thi dựa trên cơ sở dữ liệu PostgreSQL chạy trên Docker

  5. Cách lấy ngày hiện tại trong PostgreSQL