Вы можете использовать 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
значений из каждого оператора в вашей транзакции.
Вы можете попытаться получить текущее значение последовательности в начале и конце транзакции и использовать их, чтобы выяснить, какие значения последовательности использовались, но , то естьненадежно :
Кроме того, хотя несколько сеансов гарантированно выделяют различные значения последовательности, значения могут быть сгенерированы вне последовательности, когда рассматриваются все сеансы.Например, при значении cache , равном 10, сеанс A может зарезервировать значения 1..10 и вернуть nextval=1
, тогда сеанс B может зарезервировать значения 11..20 и вернуть nextval=11
до того, как сеанс Aгенерируется nextval = 2.Таким образом, при значении cache , равном единице, можно предположить, что значения nextval
генерируются последовательно;при значении cache больше единицы вы должны предполагать, что все значения nextval
различны, а не генерируются чисто последовательно.Кроме того, last_value
будет отражать последнее значение, зарезервированное для любого сеанса, независимо от того, было ли оно еще возвращено nextval
.
Таким образом, даже если ваши последовательности имеют кеш значения одного вы можете иметь несмежные значения последовательности в вашей транзакции.Тем не менее, вы можете быть в безопасности, если значение cache последовательности соответствует количеству INSERT в вашей транзакции, но я предполагаю, что оно будет слишком большим, чтобы иметь смысл.
ОБНОВЛЕНИЕ : Я только что заметил (благодаря комментариям спрашивающего), что в нем задействованы две таблицы, они немного потерялись в стене текста.
В этом случае вы сможете использовать текущий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.
И получить значения EntityKey
по одному из INSERT на AutoEntityKey
.Для обработки значений RETURNING может потребоваться какой-то сценарий.Вы также можете обернуть AutoKeyEntity
и связанные AutoKeyEntityListed
INSERT в функцию, а затем использовать INTO
, чтобы получить значение EntityKey
и вернуть его из функции:
INSERT INTO AutoKeyEntity /*...*/ RETURNING EntityKey INTO ek;
/* AutoKeyEntityListed INSERTs ... */
RETURN ek;