Bạn có thể sử dụng RETURNING
với nhiều giá trị:
psql=> create table t (id serial not null, x varchar not null);
psql=> insert into t (x) values ('a'),('b'),('c') returning id;
id
----
1
2
3
(3 rows)
Vì vậy, bạn muốn một cái gì đó giống như thế này:
INSERT INTO AutoKeyEntity (Name,Description,EntityKey) VALUES
('AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a','Testing 5/4/2011 8:59:43 AM',DEFAULT)
returning EntityKey;
INSERT INTO AutoKeyEntityListed (EntityKey,Listed,ItemIndex) VALUES
(CURRVAL('autokeyentity_entityKey_seq'),'Test 1 AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a', 0),
(CURRVAL('autokeyentity_entityKey_seq'),'Test 2 AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a', 1),
(CURRVAL('autokeyentity_entityKey_seq'),'Test 3 AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a', 2)
returning EntityKey;
-- etc.
Và sau đó bạn sẽ phải thu thập EntityKey
đã trả về giá trị từ mỗi câu lệnh trong giao dịch của bạn.
Bạn có thể cố gắng lấy giá trị hiện tại của trình tự khi bắt đầu và kết thúc giao dịch và sử dụng các giá trị đó để tìm ra giá trị trình tự nào đã được sử dụng nhưng that không đáng tin cậy :
Vì vậy, ngay cả khi chuỗi của bạn có bộ nhớ cache của một giá trị mà bạn vẫn có thể có các giá trị trình tự không liền nhau trong giao dịch của mình. Tuy nhiên, bạn có thể an toàn nếu bộ nhớ cache của trình tự giá trị khớp với số INSERT trong giao dịch của bạn nhưng tôi đoán rằng điều đó sẽ quá lớn để có ý nghĩa.
CẬP NHẬT :Tôi chỉ nhận thấy (nhờ nhận xét của người hỏi) rằng có hai bảng liên quan, hơi bị lạc trong bức tường văn bản.
Trong trường hợp đó, bạn có thể sử dụng INSERTS hiện tại:
INSERT INTO AutoKeyEntity (Name,Description,EntityKey) VALUES
('AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a','Testing 5/4/2011 8:59:43 AM',DEFAULT)
returning EntityKey;
INSERT INTO AutoKeyEntityListed (EntityKey,Listed,ItemIndex) VALUES
(CURRVAL('autokeyentity_entityKey_seq'),'Test 1 AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a', 0),
(CURRVAL('autokeyentity_entityKey_seq'),'Test 2 AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a', 1),
(CURRVAL('autokeyentity_entityKey_seq'),'Test 3 AutoKey 254e3c64-485e-42a4-b1cf-d2e1e629df6a', 2);
-- etc.
Và lấy EntityKey
từng giá trị một từ INSERTs trên AutoEntityKey
. Có thể cần một số loại tập lệnh để xử lý các giá trị RETURNING. Bạn cũng có thể bọc AutoKeyEntity
và AutoKeyEntityListed
có liên quan CHÈN trong một hàm, sau đó sử dụng INTO
để lấy EntityKey
giá trị và trả về nó từ hàm:
INSERT INTO AutoKeyEntity /*...*/ RETURNING EntityKey INTO ek;
/* AutoKeyEntityListed INSERTs ... */
RETURN ek;