Du kan använda RETURNING
med flera värden:
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)
Så du vill ha något mer som detta:
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.
Och sedan måste du samla in den returnerade EntityKey
värden från varje uttalande i din transaktion.
Du kan försöka ta tag i sekvensens aktuella värde i början och slutet av transaktionen och använda dem för att ta reda på vilka sekvensvärden som användes men som inte är tillförlitligt :
Så även om dina sekvenser har cache värden för en kan du fortfarande ha icke-sammanhängande sekvensvärden i din transaktion. Du kan dock vara säker om sekvensens cache värdet matchar antalet INSERT i din transaktion men jag antar att det kommer att vara för stort för att vara meningsfullt.
UPPDATERA :Jag märkte precis (tack vare frågeställarens kommentarer) att det är två tabeller inblandade, gick lite vilse i textväggen.
I så fall bör du kunna använda nuvarande INSLAG:
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.
Och ta tag i EntityKey
värden ett i taget från INSERTs på AutoEntityKey
. Någon sorts skript kan behövas för att hantera RETURNING-värdena. Du kan också slå in AutoKeyEntity
och relaterad AutoKeyEntityListed
INFOGA i en funktion, använd sedan INTO
för att ta tag i EntityKey
värde och returnera det från funktionen:
INSERT INTO AutoKeyEntity /*...*/ RETURNING EntityKey INTO ek;
/* AutoKeyEntityListed INSERTs ... */
RETURN ek;