Você pode usar
RETURNING
com vários valores: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)
Então você quer algo mais assim:
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.
E então você terá que reunir o
EntityKey
retornado valores de cada extrato em sua transação. Você pode tentar pegar o valor atual da sequência no início e no final da transação e usá-los para descobrir quais valores de sequência foram usados, mas não é confiável :
Portanto, mesmo que suas sequências tenham cache valores de um, você ainda pode ter valores de sequência não contíguos em sua transação. No entanto, você pode estar seguro se o cache da sequência value corresponde ao número de INSERTs em sua transação, mas acho que isso será muito grande para fazer sentido.
ATUALIZAÇÃO :Acabei de notar (graças aos comentários do questionador) que existem duas tabelas envolvidas, fiquei um pouco perdido na parede de texto.
Nesse caso, você deve poder usar os INSERTS atuais:
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.
E pegue a
EntityKey
valores um de cada vez dos INSERTs em AutoEntityKey
. Algum tipo de script pode ser necessário para manipular os valores RETURNING. Você também pode envolver o AutoKeyEntity
e AutoKeyEntityListed
relacionado INSERTs em uma função, então use INTO
para pegar a EntityKey
value e retorne-o da função:INSERT INTO AutoKeyEntity /*...*/ RETURNING EntityKey INTO ek;
/* AutoKeyEntityListed INSERTs ... */
RETURN ek;