sql >> Databáze >  >> RDS >> PostgreSQL

Vrácení více hodnot SERIAL z dávkové přílohy Posgtres

Můžete použít RETURNING s více hodnotami:

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)

Takže chcete něco podobného:

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.

A pak budete muset získat vrácený EntityKey hodnoty z každého výpisu ve vaší transakci.

Můžete zkusit získat aktuální hodnotu sekvence na začátku a na konci transakce a použít je k určení, které hodnoty sekvence byly použity, ale to není spolehlivé :

Tedy, i když vaše sekvence mají mezipaměť hodnoty jedné, stále můžete mít v transakci nesouvislé sekvenční hodnoty. Můžete však být v bezpečí, pokud se sekvence nachází v mezipaměti hodnota odpovídá počtu INSERTů ve vaší transakci, ale myslím, že to bude příliš velké na to, aby to dávalo smysl.

AKTUALIZACE :Právě jsem si všiml (díky komentářům tazatele), že se jedná o dvě tabulky, trochu jsem se ztratil ve stěně textu.

V takovém případě byste měli být schopni použít aktuální 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.

A uchopte EntityKey hodnoty jedna po druhé z INSERTs na AutoEntityKey . Pro zpracování hodnot VRÁCENÍ může být potřeba nějaký skript. Můžete také zabalit AutoKeyEntity a související AutoKeyEntityListed INSERT ve funkci a poté použijte INTO uchopit EntityKey value a vrátí ji z funkce:

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


  1. 4 způsoby, jak převést číslo na procento v SQL Server (T-SQL)

  2. Dynamický runtime výběr schématu PostgreSQL v jOOQ

  3. Přístup k Mysql odepřen kvůli chybě uživatele?

  4. Přístup ke sloupci z tabulky aktualizace v poddotazu v mysql