Můžete použít RETURNING
s více hodnotami:
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)
Takže chcete něco podobného:
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.
A pak budete muset získat vrácený EntityKey
hodnoty z každého výpisu ve vaší transakci.
Můžete zkusit získat aktuální hodnotu sekvence na začátku a na konci transakce a použít je k určení, které hodnoty sekvence byly použity, ale to není spolehlivé :
Tedy, i když vaše sekvence mají mezipaměť hodnoty jedné, stále můžete mít v transakci nesouvislé sekvenční hodnoty. Můžete však být v bezpečí, pokud se sekvence nachází v mezipaměti hodnota odpovídá počtu INSERTů ve vaší transakci, ale myslím, že to bude příliš velké na to, aby to dávalo smysl.
AKTUALIZACE :Právě jsem si všiml (díky komentářům tazatele), že se jedná o dvě tabulky, trochu jsem se ztratil ve stěně textu.
V takovém případě byste měli být schopni použít aktuální INSERTS:
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.
A uchopte EntityKey
hodnoty jedna po druhé z INSERTs na AutoEntityKey
. Pro zpracování hodnot VRÁCENÍ může být potřeba nějaký skript. Můžete také zabalit AutoKeyEntity
a související AutoKeyEntityListed
INSERT ve funkci a poté použijte INTO
uchopit EntityKey
value a vrátí ji z funkce:
INSERT INTO AutoKeyEntity /*...*/ RETURNING EntityKey INTO ek;
/* AutoKeyEntityListed INSERTs ... */
RETURN ek;