sql >> Databasteknik >  >> RDS >> PostgreSQL

Returnerar flera SERIAL-värden från Posgtres batchinlaga

Du kan använda RETURNING med flera värden:

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)

Så du vill ha något mer som detta:

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.

Och sedan måste du samla in den returnerade EntityKey värden från varje uttalande i din transaktion.

Du kan försöka ta tag i sekvensens aktuella värde i början och slutet av transaktionen och använda dem för att ta reda på vilka sekvensvärden som användes men som inte är tillförlitligt :

Så även om dina sekvenser har cache värden för en kan du fortfarande ha icke-sammanhängande sekvensvärden i din transaktion. Du kan dock vara säker om sekvensens cache värdet matchar antalet INSERT i din transaktion men jag antar att det kommer att vara för stort för att vara meningsfullt.

UPPDATERA :Jag märkte precis (tack vare frågeställarens kommentarer) att det är två tabeller inblandade, gick lite vilse i textväggen.

I så fall bör du kunna använda nuvarande INSLAG:

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.

Och ta tag i EntityKey värden ett i taget från INSERTs på AutoEntityKey . Någon sorts skript kan behövas för att hantera RETURNING-värdena. Du kan också slå in AutoKeyEntity och relaterad AutoKeyEntityListed INFOGA i en funktion, använd sedan INTO för att ta tag i EntityKey värde och returnera det från funktionen:

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


  1. PHP MySQLi multi_query förberedd uttalande

  2. Färger i psql-prompten

  3. Hur avrundar man millisekundersvärde från tidsstämpel(0) i PostgreSQL?

  4. MySql-processlista fylld med sömnposter som leder till för många anslutningar?