PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Retornando vários valores SERIAL da inserção de lote Posgtres


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;