sql >> Database >  >> RDS >> PostgreSQL

Meerdere SERIAL-waarden retourneren vanuit Posgtres batch-insert

U kunt RETURNING . gebruiken met meerdere waarden:

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)

Dus je wilt meer zoals dit:

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.

En dan moet je de geretourneerde EntityKey . verzamelen waarden van elk afschrift in uw transactie.

Je zou kunnen proberen de huidige waarde van de reeks aan het begin en einde van de transactie te pakken en die gebruiken om erachter te komen welke reekswaarden werden gebruikt, maar dat is niet betrouwbaar :

Dus zelfs als uw reeksen cache . hebben waarden van één kunt u nog steeds niet-aaneengesloten reekswaarden in uw transactie hebben. U kunt echter veilig zijn als de cache . van de reeks waarde komt overeen met het aantal INSERT's in uw transactie, maar ik vermoed dat dat te groot zal zijn om logisch te zijn.

UPDATE :Ik merkte net (dankzij de opmerkingen van de vraagsteller) dat er twee tabellen bij betrokken zijn, raakte een beetje verdwaald in de tekstmuur.

In dat geval zou u de huidige INSERTS moeten kunnen gebruiken:

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.

En pak de EntityKey waarden één voor één uit de INSERT's op AutoEntityKey . Er kan een soort script nodig zijn om de RETURNING-waarden te verwerken. U kunt ook de AutoKeyEntity en gerelateerde AutoKeyEntityListed INSERTs in een functie, gebruik dan INTO om de EntityKey te pakken waarde en retourneer het van de functie:

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


  1. hoe java-datumtype op te slaan in mysql-datumtype?

  2. MySQL LOAD DATA LOKAAL INFILE niet toegestaan ​​via ODBC

  3. SQL Server:Tabel Meta-Data extraheren (beschrijving, velden en hun datatypes)

  4. Query om alle pakketten te doorzoeken op tabel en/of kolom