Fórumok
Ü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
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)
Ez majdnem jó, csak a bar táblába is be akarom szúrni az id sorokhoz tartozó értéket, nem csak parent.id-t!
Nem tudom mennyire érthető.
SELECT id, "asd" AS typeId, "qwertz" AS val FROM parent a primary query-nek?
De továbbra is: erre a currval tökéletesen elég, nem kell kézzel másolgatni.
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
//
Csak az 'AS valtozo' nem használható fel a második INSERT INTO-ban.
Ha az elso select elott volt egy DECLARE valtozo bigint; akkor igen.
INSERT INTO detail(mid,detail,val) values ((SELECT currval(MASTER)),detail,val);
szerintem...
---
"A megoldásra kell koncentrálni nem a problémára."