Bạn có thể sử dụng lastval()
chức năng:
Giá trị trả về thu được gần đây nhất nextval
cho bất kỳ chuỗi nào
Vì vậy, một cái gì đó như thế này:
INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val) VALUES (lastval());
Điều này sẽ hoạt động tốt miễn là không có ai gọi nextval()
đến bất kỳ chuỗi nào khác (trong phiên hiện tại) giữa các INSERT của bạn.
Như Denis đã lưu ý bên dưới và tôi đã cảnh báo ở trên, việc sử dụng lastval()
có thể khiến bạn gặp rắc rối nếu một chuỗi khác được truy cập bằng cách sử dụng nextval()
giữa các INSERT của bạn. Điều này có thể xảy ra nếu có một kích hoạt INSERT trên Table1
đó được gọi theo cách thủ công nextval()
trên một chuỗi hoặc nhiều khả năng hơn đã thực hiện INSERT trên bảng có khóa SERIAL
hoặcBIGSERIAL
khóa chính. Nếu bạn muốn thực sự hoang tưởng (một điều tốt, họ thực sự là bạn để có được bạn), thì bạn có thể sử dụng currval()
nhưng bạn cần biết tên của chuỗi liên quan:
INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val) VALUES (currval('Table1_id_seq'::regclass));
Trình tự tự động tạo ra thường được đặt tên theo t_c_seq
nơi t
là tên bảng và c
là tên cột nhưng bạn luôn có thể tìm hiểu bằng cách đi sâu vào psql
và nói:
=> \d table_name;
và sau đó xem xét giá trị mặc định cho cột được đề cập, ví dụ:
id | integer | not null default nextval('people_id_seq'::regclass)
FYI: lastval()
ít nhiều là phiên bản PostgreSQL của MySQL LAST_INSERT_ID
. Tôi chỉ đề cập đến vấn đề này vì nhiều người quen thuộc với MySQL hơn PostgreSQL nên việc liên kết lastval()
đến một thứ quen thuộc có thể làm rõ mọi thứ.