PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Renvoi de plusieurs valeurs SERIAL à partir de l'insertion de lots Posgtres

Vous pouvez utiliser RETURNING avec plusieurs valeurs :

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)

Donc, vous voulez quelque chose de plus comme ceci :

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.

Et ensuite, vous devrez rassembler le EntityKey renvoyé valeurs de chaque relevé de votre transaction.

Vous pouvez essayer de saisir la valeur actuelle de la séquence au début et à la fin de la transaction et les utiliser pour déterminer quelles valeurs de séquence ont été utilisées, mais qui n'est pas fiable :

Ainsi, même si vos séquences ont un cache valeurs de un, vous pouvez toujours avoir des valeurs de séquence non contiguës dans votre transaction. Cependant, vous pourriez être en sécurité si le cache de la séquence la valeur correspond au nombre d'INSERTS dans votre transaction, mais je suppose que cela va être trop grand pour avoir un sens.

MISE À JOUR :Je viens de remarquer (grâce aux commentaires du questionneur) qu'il y a deux tableaux impliqués, je me suis un peu perdu dans le mur de texte.

Dans ce cas, vous devriez pouvoir utiliser les INSERTS actuels :

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.

Et saisissez le EntityKey valeurs une à la fois à partir des INSERTs sur AutoEntityKey . Une sorte de script peut être nécessaire pour gérer les valeurs RETURNING. Vous pouvez également envelopper le AutoKeyEntity et AutoKeyEntityListed associé INSERT dans une fonction, puis utilisez INTO pour récupérer la EntityKey valeur et la renvoyer depuis la fonction :

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