ugrás a tartalomhoz

postgres - insert into ... select - megadott sorrendben

mind1 valami név · 2020. Dec. 3. (Cs), 23.22
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á?
 
1

Szerintem ebbe futsz bele,

BlaZe · 2020. Dec. 4. (P), 00.03
Szerintem ebbe futsz bele, ott egy megoldás is: https://www.postgresql.org/message-id/10914.1441283269%40sss.pgh.pa.us
2

Elvileg lehet, bár akkor

mind1 valami név · 2020. Dec. 4. (P), 00.48
Elvileg lehet, bár akkor valami nagyon el van cseszve a postgres belsejében.
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...
3

Kipróbáltam az ott javasolt

mind1 valami név · 2020. Dec. 4. (P), 06.06
Kipróbáltam az ott javasolt megoldást, de 1:1-ben rossz úgy is.
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;
5

Én akkor már inkább

BlaZe · 2020. Dec. 4. (P), 13.54
Én akkor már inkább pl/pgsql-ben írnám meg, mint külön programban. Nem tudom hogy működik belül a postgres, de nekem ez nem bugnak tűnik, hanem implementációs részletnek, amin jobb nem függni.

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?
6

Lásd 4.! :)

mind1 valami név · 2020. Dec. 4. (P), 14.27
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.
4

MEA CLUMPA! Ezt én csesztem el...

mind1 valami név · 2020. Dec. 4. (P), 13.08
A fura az egészben, hogy látszólag a sima select, insert nélkül jó eredményt produkál, de ott vagy nem szúrtam ki, vagy hibásan rendezett...

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:

insert into tmpstore select ss.* 
    from (select s.* from syslog s order by 
 recv_time,to_number(regexp_replace(sdata,'[^0-9]','','g'),'99999')) ss;