Portál AbcLinuxu, 14. května 2025 05:52
INSERT INTO tab1 (col1, col2) VALUES (2009, 'data1');
INSERT INTO tab2 (tab1_id, col3, col4) SELECT currval(pg_get_serial_sequence('tab1', 'id')), 600016, 'data2';
Potom to předhazuji postgresu příkazem:
psql databáze < soubor_insertů
Celé je to takto nehorázně pomalé. Zatím to nechci tlačit přes Perl - nevím, jestli bude webový server poskytovat Perl:DBI a DBD_Pg. Vcelku ideálně bych si představoval vzít proměnnou a do ní vložit hodnotu toho sekvenceru a potom do insertu dát tu proměnnou, nějak takto:
INSERT INTO tab1 (col1, col2) VALUES (2009, 'data1');
$var = currval(pg_get_serial_sequence('tab1', 'id'));
INSERT INTO tab2 (tab1_id, col3, col4) VALUES
($var, 600016, 'data2'),
...
Zatím jsem však nepřišel na to, jak takovouto proměnnou v postgresu vytvořit.
INSERT INTO tab1 ...
BEGIN transaction
INSERT INTO tab2
...
END transaction
a doba vykonávání se nezměnila (na 11" prckovi necelých 13000 insertů za necelé 3 minuty.
BEGIN;
na začátek souboru a jeden COMMIT;
na konec.
INSERT
postgresovský COPY FROM STDIN
, když ten soubor takhle přesměrováváš na standardní vstup.
INSERT
místo proměnné $var
. PostgreSQL si to už dokáže optimalizovat sám.
Ještě lépe by bylo celý záznam odeslat jako jeden INSERT a uvnitř zpracovat vloženou procedurou. Otázkou je, zda se v dané aplikaci to úsilí vyplatí. Docílí se tím vyšší konzistence dat.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.