Một cách để tham chiếu ID trong giao dịch đa chèn? (bưu điện)


8

Giả sử bảng "entity.eid" là tự động tăng, tôi muốn có thể tham chiếu giá trị tự động được chỉ định sau trong cùng một giao dịch. Cách tôi đã làm điều này là bằng cách thực hiện nhiều giao dịch mà tôi nghĩ là không tối ưu.

START TRANSACTION;
INSERT INTO entity ...;
INSERT INTO t2 (eid, ...) VALUES (?NEW EID REF HERE?, ...), (...), (...);
COMMIT;

Câu trả lời:


11

Có nhiều cách khác nhau để làm điều này.

Cách dễ nhất là sử dụng lastval()hàm sẽ trả về giá trị được tạo bởi chuỗi "giá trị" cuối cùng.

START TRANSACTION;
INSERT INTO entity ...;
INSERT INTO t2 (eid, ...) VALUES (lastval(), ...), (...), (...);
COMMIT;

Nếu bạn biết tên của chuỗi cho entitybảng, bạn cũng có thể sử dụng currvalhàm:

START TRANSACTION;
INSERT INTO entity ...;
INSERT INTO t2 (eid, ...) VALUES (currval('entity_eid_seq'), ...), (...), (...);
COMMIT;

Điều này có thể được viết theo cách tổng quát hơn bằng cách sử dụng pg_get_serial_sequence()hàm, tránh để mã hóa tên chuỗi:

START TRANSACTION;
INSERT INTO entity ...;
INSERT INTO t2 (eid, ...) VALUES (currval(pg_get_serial_sequence('entity', 'eid')), ...), (...);
COMMIT;

Để biết thêm chi tiết, vui lòng xem hướng dẫn: http://www.postgresql.org/docs/civerse/static/fifts- resultence.html


7

Bạn không chỉ định phiên bản Postgresql của mình, nhưng nếu bạn đang sử dụng 8.4+, bạn có thể sử dụng RETURNINGmệnh đề để trả về id (hoặc bất kỳ cột nào) vừa được chèn.

Tài liệu: http://www.postgresql.org/docs/civerse/static/sql-insert.html

Thí dụ:

INSERT INTO t2 (eid, ...) VALUES (...) RETURNING eid;

Nếu bạn đang sử dụng Postgresql phiên bản 9.1+, bạn cũng có thể sử dụng WITHmệnh đề (aka Common Table Expressions) để thực hiện thao tác chèn vào một mệnh đề, sau đó tham chiếu các giá trị từ RETURNINGmệnh đề để thực hiện nhiều hành động hơn (mệnh đề CÓ có thể xâu chuỗi lại với nhau).

Tài liệu về WITHmệnh đề: http://www.postgresql.org/docs/cản/static/queries-with.html


4

Điều đáng chú ý là SERIAL trong Postgres chỉ là một INT với SEQUENCE làm giá trị mặc định, bạn có thể dễ dàng tự truy vấn trình sắp xếp chuỗi trong giao dịch thay vì chèn vào bảng cho phép xảy ra mặc định.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.