Можете да използвате RETURNING
с множество стойности:
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)
Така че искате нещо повече от това:
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.
И тогава ще трябва да съберете върнатия EntityKey
стойности от всяко извлечение във вашата транзакция.
Можете да опитате да вземете текущата стойност на последователността в началото и в края на транзакцията и да ги използвате, за да разберете кои стойности на последователността са използвани, но което не е надеждно :
Така че дори вашите последователности да имат кеш стойности на една, все още можете да имате стойности на несъседна последователност във вашата транзакция. Въпреки това може да сте в безопасност, ако кеша на последователността стойност съвпада с броя на INSERT във вашата транзакция, но предполагам, че това ще бъде твърде голямо, за да има смисъл.
АКТУАЛИЗАЦИЯ :Току-що забелязах (благодарение на коментарите на питащия), че има две включени таблици, малко се изгубих в стената от текст.
В такъв случай трябва да можете да използвате текущите ВЛОЖКИ:
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.
И вземете EntityKey
стойности една по една от INSERT на AutoEntityKey
. Може да е необходим някакъв вид скрипт за обработка на ВРЪЩАЩИТЕ стойности. Можете също така да обвиете AutoKeyEntity
и свързан AutoKeyEntityListed
INSERTs във функция, след което използвайте INTO
за да вземете EntityKey
стойност и я връща от функцията:
INSERT INTO AutoKeyEntity /*...*/ RETURNING EntityKey INTO ek;
/* AutoKeyEntityListed INSERTs ... */
RETURN ek;