Du kan bruge RETURNING
med flere værdier:
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 vil have noget mere som dette:
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.
Og så skal du samle den returnerede EntityKey
værdier fra hver erklæring i din transaktion.
Du kan prøve at få fat i sekvensens aktuelle værdi i begyndelsen og slutningen af transaktionen og bruge dem til at finde ud af, hvilke sekvensværdier der blev brugt, men der ikke er pålideligt :
Så selvom dine sekvenser har cache værdier af en kan du stadig have ikke-sammenhængende sekvensværdier i din transaktion. Du kan dog være sikker, hvis sekvensens cache værdi matcher antallet af INSERT i din transaktion, men jeg vil gætte på, at det bliver for stort til at give mening.
OPDATERING :Jeg har lige bemærket (takket være spørgerens kommentarer), at der er to tabeller involveret, forvildet mig lidt i tekstvæggen.
I så fald bør du være i stand til at bruge de nuværende 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.
Og tag fat i EntityKey
værdier én ad gangen fra INSERT'erne på AutoEntityKey
. En slags script kan være nødvendig for at håndtere RETURNING-værdierne. Du kan også pakke AutoKeyEntity
og relaterede AutoKeyEntityListed
INSERT i en funktion, og brug derefter INTO
for at få fat i EntityKey
værdi og returner den fra funktionen:
INSERT INTO AutoKeyEntity /*...*/ RETURNING EntityKey INTO ek;
/* AutoKeyEntityListed INSERTs ... */
RETURN ek;