PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Zurückgeben mehrerer SERIAL-Werte aus der Posgtres-Batch-Einfügung

Sie können RETURNING verwenden mit mehreren Werten:

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)

Sie wollen also eher so etwas:

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.

Und dann müssen Sie den zurückgegebenen EntityKey sammeln Werte aus jeder Anweisung in Ihrer Transaktion.

Sie könnten versuchen, den aktuellen Wert der Sequenz zu Beginn und am Ende der Transaktion abzurufen und diese verwenden, um herauszufinden, welche Sequenzwerte verwendet wurden, aber das nicht zuverlässig ist :

Also, auch wenn Ihre Sequenzen Cache haben Werten von eins können Sie immer noch nicht zusammenhängende Sequenzwerte in Ihrer Transaktion haben. Sie könnten jedoch sicher sein, wenn der Cache der Sequenz value stimmt mit der Anzahl der INSERTs in Ihrer Transaktion überein, aber ich vermute, dass das zu groß ist, um Sinn zu machen.

AKTUALISIEREN :Mir ist gerade aufgefallen (dank der Kommentare des Fragestellers), dass es sich um zwei Tabellen handelt, bin etwas in der Textwand verloren gegangen.

In diesem Fall sollten Sie die aktuellen INSERTS verwenden können:

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.

Und schnapp dir den EntityKey Werte einzeln aus den INSERTs auf AutoEntityKey . Möglicherweise ist eine Art Skript erforderlich, um die RETURNING-Werte zu verarbeiten. Sie könnten auch AutoKeyEntity umschließen und zugehörige AutoKeyEntityListed INSERTs in einer Funktion, dann verwenden Sie INTO um den EntityKey zu greifen Wert und geben Sie ihn von der Funktion zurück:

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