sql >> Database teknologi >  >> RDS >> PostgreSQL

Returnerer flere SERIE-værdier fra Posgtres batch-indlæg

Du kan bruge RETURNING med flere værdier:

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 vil have noget mere som dette:

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.

Og så skal du samle den returnerede EntityKey værdier fra hver erklæring i din transaktion.

Du kan prøve at få fat i sekvensens aktuelle værdi i begyndelsen og slutningen af ​​transaktionen og bruge dem til at finde ud af, hvilke sekvensværdier der blev brugt, men der ikke er pålideligt :

Så selvom dine sekvenser har cache værdier af en kan du stadig have ikke-sammenhængende sekvensværdier i din transaktion. Du kan dog være sikker, hvis sekvensens cache værdi matcher antallet af INSERT i din transaktion, men jeg vil gætte på, at det bliver for stort til at give mening.

OPDATERING :Jeg har lige bemærket (takket være spørgerens kommentarer), at der er to tabeller involveret, forvildet mig lidt i tekstvæggen.

I så fald bør du være i stand til at bruge de nuværende INSERTS:

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.

Og tag fat i EntityKey værdier én ad gangen fra INSERT'erne på AutoEntityKey . En slags script kan være nødvendig for at håndtere RETURNING-værdierne. Du kan også pakke AutoKeyEntity og relaterede AutoKeyEntityListed INSERT i en funktion, og brug derefter INTO for at få fat i EntityKey værdi og returner den fra funktionen:

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


  1. db.create_all() 'NoneType'-objekt har ingen attribut 'drivername'

  2. Få MySQL-forespørgselsresultater som deres oprindelige datatype?

  3. Sådan sletter du poster i DB med mySQL ved hjælp af group by

  4. Performance Tuning:Opret indeks for boolesk kolonne