postgres - insert into ... select - megadott sorrendben
Na ezzel mit kezdjek?
Van egy táblám, másodperc alapú timestamp mezővel, plusz egy olyan mező, ahol ugyan van egy sorszám, de ez a táblát író program újraindulásakor resetelődik.
Ha időrendben akarom látni a sorokat, akkor SELECT * FROM ... ORDER BY timestamp,sorszam; paranccsal tudom lekérdezni azokat. (A sima timestamp nem elég, mert másodpercenként több sor is keletkezhet)
Az a gondom, hogy felvennék a táblához egy BIGSERIAL típusú mezőt, de ugye ezt egy sima ALTER TABLE ... ADD COLUMN nem töltené fel. Jobb ötlet hiányában létrehoznék egy új táblát, a meglévő oszlopokkal+a bigserial mezővel és egy
INSERT INTO ujtabla SELECT * FROM regitabla ORDER BY timestamp,sorszam; paranccsal vinném át az új táblába. Gyönyörűen feltölti a bigserial oszlopot, csakhogy a sorrend nem stimmel, hiába az order by az insert selectjében. Olyan, mintha csak a timestamp alapján rendezne.
Hogy tudnám átmasolni a sorokat úgy, hogy jó sorszámokat kapjanak a másolatok?
Tényleg muszáj programot írni rá?
■ Van egy táblám, másodperc alapú timestamp mezővel, plusz egy olyan mező, ahol ugyan van egy sorszám, de ez a táblát író program újraindulásakor resetelődik.
Ha időrendben akarom látni a sorokat, akkor SELECT * FROM ... ORDER BY timestamp,sorszam; paranccsal tudom lekérdezni azokat. (A sima timestamp nem elég, mert másodpercenként több sor is keletkezhet)
Az a gondom, hogy felvennék a táblához egy BIGSERIAL típusú mezőt, de ugye ezt egy sima ALTER TABLE ... ADD COLUMN nem töltené fel. Jobb ötlet hiányában létrehoznék egy új táblát, a meglévő oszlopokkal+a bigserial mezővel és egy
INSERT INTO ujtabla SELECT * FROM regitabla ORDER BY timestamp,sorszam; paranccsal vinném át az új táblába. Gyönyörűen feltölti a bigserial oszlopot, csakhogy a sorrend nem stimmel, hiába az order by az insert selectjében. Olyan, mintha csak a timestamp alapján rendezne.
Hogy tudnám átmasolni a sorokat úgy, hogy jó sorszámokat kapjanak a másolatok?
Tényleg muszáj programot írni rá?
Szerintem ebbe futsz bele,
Elvileg lehet, bár akkor
Ugyanis nem a selectben van a nextval(), hanem az új tábla utolsó oszlopa egy bigserial, aminek az insert során, amikor létrejön az új sor, akkor illene értéket kapnia.
Oracle-ből talán még ki tudnék csikarni egy execution plant, a postgrest nem ismerem ennyire.
Mobilról nem tudom bemásolni a szkripteket, majd reggel ha nem felejtem el...
Kipróbáltam az ott javasolt
Marad, hogy programot írok, ami egyenként tölti át az egészet.
Azért ez már inkább bug, mint szabályos működés
Insert into uj select ss.*,nextval('seqnam') from (
select * from regi order by timestamp, serial
) ss;
Én akkor már inkább
Azt nézted egyébként, hogy ha nincs az insert into, csak a 2 select, akkor is figyelmen kívül hagyja-e a belső select eredményének sorrendjét?
Lásd 4.! :)
Elsőre is jól csinálta, én néztem el nagyon csúnyán, hogy text és nem numerikus rendezést csinált.
MEA CLUMPA! Ezt én csesztem el...
A timestamp után egy sdata nevű szöveges mező áll (syslog rfc5424 formátum), amiben van ugyan egy növekvő sorszám, de text formában:
[meta sequenceId="110"]
Ez addig jó, amíg az egymást követő számok nagyságrendje azonos, de ebben a felállásban a "110" UTÁN jön a "99"... Helyesen... Én meg tegnap este óta vergődöm azon, hogy miért rossz a sorrend...
A szükséges insert valami ilyen: