[megoldva]PgSQL rekordok másolása kulcs id-vel

Üdv!
Egy PgSQL adatbázisban van egy master-detail táblakapcsolat, pl.:
master (mid,name,typeid,desc...)
detail (mid,detail,val...)

Az mid mező egy serial (autoincrement) és ez a kulcsmező a master táblában, amivel a detail táblához kapcsolódik.

Ez alapján próbálom azt megoldani (pgsql script), hogy mindkét táblában egy rekordot szeretnék lemásolni (adott feltétellel, pl. mid=25), de az mid mezőt fel kellene használnom a detail táblában:

// eddig működik:
INSERT INTO master(name,typeid,desc)
(SELECT name,typeid,desc FROM master WHERE mid=25)
RETURNING mid;

//
// INSERT INTO detail(mid,detail,val)... ???
//

A "RETURNING mid" értékét el kellene tárolni, hogy felhasználjam az INSERT INTO detail... részben.

Hogyan lehet ezt megtenni?

Hozzászólások

Fizetnék érte, ha érteném a kérdésed. :)

define(lemásolni)?

Lehet hogy elbonyolítottam. :) Elnézést!
Tehát mint egy beszerzési megrendelés fej és teteladatai (master-detail). Ezeket szeretném "lemásolni", mint beszerzés.
Azaz az adatok ugyanazok leszenk a master-detail táblákban (persze majd 1-2 adatot módosítok benne, de nem ez a lényeg most), viszont az mid egy autogenerált azonosító (master tábla) lenne és ezt szeretném csak a második (detail) INSERT-ben felhasználni.

WITH statement? http://www.postgresql.org/docs/9.5/static/queries-with.html


CREATE TABLE foo (id integer);
CREATE TABLE bar (id integer);
WITH parent AS (INSERT INTO foo VALUES (1) RETURNING id)
        INSERT INTO bar
        SELECT id FROM parent;

Ha jól gondolom, a fenti //eddig működik kommenttel jelzett kérésed megy az AS-ba, az INSERT INTO bar lesz az INSERT INTO detail, a SELECT-ben pedig összepakolod a detail-be kellő adatokat.

A másik megoldás, hogy lekéred a sequence utolsó értékét (currval: http://www.postgresql.org/docs/8.1/static/functions-sequence.html), de az már túl egyszerű :)

BlackY
--
"en is amikor bejovok dolgozni, nem egy pc-t [..] kapcsolok be, hanem a mainframe-et..." (sj)

Megoldva:

WITH parent AS (
INSERT INTO master(name,typeid,desc)
(SELECT name,typeid,desc FROM master WHERE mid=25)
RETURNING mid)
INSERT INTO detial(mid,detail,val)
SELECT parent.mid,detail,val FROM detail i CROSS JOIN parent WHERE i.mid=25;

Kipróbáltam, működik. :)
Köszönöm mindenkinek a segítséget!

szerintem...

szerk.: bár tranzakción belül simán lekérheted a max(mid) értéket a master-ből, az elvben az lesz amit te beszúrtál. Ez persze nem szép, de legalább csúnya.

...
RETURNING mid AS valtozo;

//
// INSERT INTO detail(mid,detail,val)VALUES valtozo, detail, val
//

INSERT INTO detail(mid,detail,val) values ((SELECT currval(MASTER)),detail,val);
szerintem...

---
"A megoldásra kell koncentrálni nem a problémára."