Vícenásobný INSERT v MySQL

Pokud potřebujeme do databáze vložit více řádků, většinou se to dělá tak, že se postupně pokládají dotazy pro vložení jednotlivých řádků. Tedy v PHP nějak takto:

foreach($tags as $tag) {
   $db->query('INSERT INTO [tags] (name,title) VALUES("'.$tag->name.'", "'.$tag->title.'")');
}

Tento způsob je ale celkem neefektivní, v MySQL ovšem můžeme použít následující syntaxi, která nám umožňuje vložit více řádků v jenom dotazu:

$db->query('INSERT INTO [tags] (name,title) VALUES ("accik", "Accík"), ("accing", "Accing")');

Problém ovšem může nastat v tom případě, pokud bude sloupec name unikátní a zkusíme do něj vložit již existující hodnotu. V tom případě se totiž vkládání neprovede. Řešení je ovšem jednoduché, stačí použít klíčové slovo INGNORE.

Pokud je tento článek „nošením dříví do lesa“, tak se vám omlouvám. Jenže na českém webu jsem o tom nenalezl žádnou zmínku a třeba se to někdy někomu bude hodit.

Komentáře

1

Fajn připomenutí, až teď mi došlo, že takhle třeba phpmyadmin exportuje data, a že to proto odněkud znám :-)

Non_E · 22. 5. 2007 · 0.04 · reagovat
2

jj, taky jsem to odkoukal z phpMyAdminu.

Honza M. · 4. 6. 2007 · 13.45 · reagovat
3

Jste fakt dobří…já to nikde neviděl a ani jsem o tom nevěděl…a v podstatě řeším jak poslat 30 záznamů s jedinečným ID po úpravě zpátky do mysql…pomůžou mi nějak ty dva příklady?

M.

Musachi · 14. 9. 2007 · 22.16 · reagovat
4

Ještě za zmínku stojí využití ON DUPLICATE KEY (nevím, jestli to není to, co potřebuje Musachi). Příklad: mám relační tabulku, která slouží k propojení dvou tabulek v M:N relaci. Nad ID z obou tabulek (ID uchazeče a ID jazyka) je unique klíč a dále je tam jeden sloupec, který se může změnit při editaci (jazyková schopnost uchazeče). Pokud chci, aby se vložily hodnoty do databáze a v případě již existujícího klíče se pouze změnila hodnota u jazykové schopnosti uchazeče, bude dotaz vypadat takto: > INSERT INTO uchazec_jazyk (id_uchazec, id_jazyk, schopnost) VALUES (3, 1, 1) , (3, 2, 1) , (3, 3, 1) , (3, 4, 1) , (3, 5, 1) , (3, 6, 1) , (3, 7, 1) ON DUPLICATE KEY UPDATE schopnost = VALUES(schopnost);

sairon · 22. 9. 2007 · 20.15 · reagovat
5

Pro mě byl tento článek obrovský přínosný, takže autorovi děkuju. Já vícenásobný INSERT dělal tak, že sem prostě vypsal inserty za sebe a oddělil středníkama a celek jako string odeslal: INSERT INTO table (sloupec1, sloupec2) values (hodnotaSloupce1, hodnotaSloupce2); INSERT INTO …

To PHP neskousne. Takže dík..

Racky · 21. 1. 2008 · 21.04 · reagovat
6

Nicméně teď zjišťuju, že když potřebuju provést více různých dotazů záležících na konkrétních hodnotách zadaných uživatelem, tak PHP asi neumí odeslat dotaz který obsahuje více poddotazů.. Například: INSERT INTO …; DELETE FROM …; když toto odešlu jedním dotazem do databáze, tak PHP hodí chybu, přitom když to napíšu do DBS rušně, tak ta to vezme v pohodě.. Neporadí někdo?

Racky · 21. 1. 2008 · 21.22 · reagovat
7

Dobrý den, Jsem moc rád že jsem narazil na tuhle stránku a snad mi tu pomůžete i když si budete myslet že jsem úplně …, tak Vás moc prosím o radu. Jsem začátečník a už mám téměř hotovej shopík,ale nejde mi hromadné vložení do databáze. Mám vše uložený v sessionu pod id_produktu kterej vyvolávam: $_SESSION[‚ko­sik‘][$řádek[‚id_pro­duktu‘]]; Jak to mám udělat aby se zapsali všechny produkty co si zákazník vložil do košíku? Tenhle script jsem ani netestoval páč mu vůbec nerotumím. Poradí mi někdo? Děkuju předem moc za všechny odezvy.

foreach($tags as $_SESSION[‚ko­sik‘][$řádek[‚id_pro­duktu‘]]) { $db->query(‚INSERT INTO [tags] (id_objednavky,jme­no) VALUES(„‘.$tag->id_produktu.‚“, „‘.$tag->jmeno.‚“)‘); }

night · 26. 2. 2009 · 1.54 · reagovat

Zanechte komentář

(vyžadováno)
(nebude zobrazen) (vyžadováno)

Můžete použít Texy! formátování.