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ếunextval
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 thinextval
kể từ sessiondid hiện tại.Chức năng này yêu cầu
USAGE
hoặcSELECT
đặ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ớicurrval
, 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àonextval
đã được áp dụng gần đây nhất cho trong phiên hiện tại. Có lỗi khi gọilastval
ifnextval
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ặcSELECT
đặ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.