sql >> Base de Datos >  >> RDS >> PostgreSQL

Devolver múltiples valores SERIAL de la inserción de lotes de Posgtres

Puedes usar RETURNING con múltiples 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)

Así que quieres algo más como esto:

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.

Y luego tendrás que recopilar la EntityKey devuelta valores de cada declaración en su transacción.

Puede intentar tomar el valor actual de la secuencia al principio y al final de la transacción y usarlos para averiguar qué valores de secuencia se usaron pero eso no es confiable :

Entonces, incluso si sus secuencias tienen caché valores de uno aún puede tener valores de secuencia no contiguos en su transacción. Sin embargo, puede estar seguro si la caché de la secuencia el valor coincide con la cantidad de INSERT en su transacción, pero supongo que será demasiado grande para tener sentido.

ACTUALIZAR :Acabo de darme cuenta (gracias a los comentarios del interrogador) de que hay dos tablas involucradas, me perdí un poco en la pared de texto.

En ese caso, debería poder usar los INSERTOS actuales:

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.

Y toma la EntityKey valores uno a la vez de los INSERT en AutoEntityKey . Es posible que se necesite algún tipo de secuencia de comandos para manejar los valores de RETORNO. También podría envolver el AutoKeyEntity y AutoKeyEntityListed relacionados INSERT en una función, luego use INTO para obtener la EntityKey value y devolverlo desde la función:

INSERT INTO AutoKeyEntity /*...*/ RETURNING EntityKey INTO ek;
/* AutoKeyEntityListed INSERTs ... */
RETURN ek;