Możesz użyć RETURNING
z wieloma wartościami:
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)
Więc chcesz czegoś bardziej takiego:
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 potem będziesz musiał zebrać zwrócony EntityKey
wartości z każdego wyciągu w Twojej transakcji.
Możesz spróbować pobrać bieżącą wartość sekwencji na początku i na końcu transakcji i użyć ich, aby dowiedzieć się, które wartości sekwencji zostały użyte, ale to nie jest niezawodne :
Tak więc, nawet jeśli Twoje sekwencje mają cache wartości jednego, nadal możesz mieć nieciągłe wartości sekwencji w swojej transakcji. Możesz być jednak bezpieczny, jeśli cache sekwencji wartość odpowiada liczbie WSTAWEK w Twojej transakcji, ale przypuszczam, że będzie to zbyt duże, aby miało sens.
AKTUALIZUJ :Właśnie zauważyłem (dzięki komentarzom pytającego), że w grę wchodzą dwa tabele, trochę się zagubiłem w ścianie tekstu.
W takim przypadku powinieneś być w stanie użyć obecnych WSTAWEK:
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.
I weź EntityKey
wartości pojedynczo z WSTAWEK w AutoEntityKey
. Może być potrzebny jakiś skrypt do obsługi wartości RETURNING. Możesz także zawinąć AutoKeyEntity
i powiązane AutoKeyEntityListed
INSERT w funkcji, a następnie użyj INTO
aby pobrać EntityKey
wartość i zwróć ją z funkcji:
INSERT INTO AutoKeyEntity /*...*/ RETURNING EntityKey INTO ek;
/* AutoKeyEntityListed INSERTs ... */
RETURN ek;