Autor Zpráva
Paja222
Profil
Zdravím,

potřebuji poradit, zda jde v jednom dotazu vložit do db více záznamů. Dotazy mám typu:
INSERT INTO tabulka SET a=1, b=2
Vím, že by šlo předělat inserty a místo set použít (a,b) VALUES (1,2),(3,4). Toto ale vzhledem k obrovské tabulce (cca 90 sloupečků) a množství dat použít nemohu. Dotaz se generuje automaticky přes PHP a nelze ho do této míry upravit.

Stávající systém funguje tak, že se do databáze vkládá řádek po řádku, ovšem při množství 10 000 řádků je to nevhodné. Tento systém jsem dostal na optimalizaci aby fungoval jak má, takže ho nemohu celý předělat :-) Co ještě zbývá dodat - že tento dotaz je volán naštěstí pouze cronem 1x denně.

Děkuji za jakoukoliv pomoc, jak tento problém vyřešit.
tiso
Profil
Paja222: Nerozumiem prečo nemôžeš použiť „(a,b) VALUES (1,2),(3,4)“ syntax.
Tori
Profil
Jestli to generujete z pole sloupec => hodnota, tak stačí pomocí array_keys vytáhnout názvy sloupců a pak jen cyklem dosazovat hodnoty (a hlídat délku výsledného SQL, aby nepřekročilo limit).
Paja222
Profil
Tori: Problém je ten, že to generuje v poli - asociovaným. Klíč = název sloupce, hodnota = hodnota. A každé pole má jiná data.

Příklady:
$a['a'] = 1
$a['b'] = 2
-------
$b['d'] = 3
$b['e'] = 4
-----
$c['a'] = 3

Prostě každé pole není kompletní a má rozdílný počet prvků. Není tedy způsob, jak to zapisovat tak, aby to fungovalo. Leda si v první závorce vypsat všech 90 sloupečků (ručně) a poté testovat jedno po druhém a podle toho je přiřazovat do druhé tabulky za VALUES, ale obávám se, že toho by bylo horší, než je to udělané nyní.
tiso
Profil
Paja222: aha, čo to teda je za tabuľku?
Ak teda musíš použiť SET syntax, tak by si mal ten insert riešiť dávkovo - nevkladať naraz 10000 riadkov, ale 10x po 1000 alebo iný počet, podľa toho, ako dlho tie inserty budú trvať. Treba vyskúšať.
Paja222
Profil
tiso: Něco velmi podobného katalogu firem. Musím se přiznat, že jsem všechny data ještě v jedný tabulce neviděl a už doufám, že neuvidím. Je to nepřehledné a zbytečně se s tím špatně pracuje. Díky tedy, dám inserty alespoň za sebe. A měl bych ještě jeden dotaz, mohlo by tomu pomoci poslat to do db přes mysqli multi_query v jednom dotazu, nebo to nemá vliv?

Dík.
tiso
Profil
multi_query by malo pomôcť, sprav si benchmark.
Alphard
Profil
Paja222:
Co třeba provést jeden select, vytáhnout si názvy sloupců a do nepotřebných dát null?
Kajman
Profil
Místo null, spíš DEFAULT.

Také jde udělat více víceřádkových insertů, pro každou kombinaci nastavených sloupečků jeden.
Paja222
Profil
Alphard:
To vůbec není špatný nápad, názvy sloupců jsou klíče v poli, tak to půjde snadno kontrolovat a doplňovat. Díky za nápad :-)

Kajman:
To by bylo zase víc a víc filtrů - vem si, že řádku je 10 000, tam by se ukázaly snad všechny kombinace, jakých je hodně :-)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: