Autor Zpráva
4ever
Profil
Chtěl bych se poradit s tímto. Mám dvě tabulky. Chci do nich vložit hromadně data. Data připravuji ve smyčce while, kde se připravuje mysql příkaz pro hromadné vložení. Problém je ale v tom, že ty dvě tabulky jsou propojené.

Funguje to tak, že v každém jednom cyklu se připraví jeden SQL příkaz pro tabulku basic_info a druhý příkaz pro druhou tabulku detaily_info. Každá tabulka má svoje pole, do kterého se ukládají SQL příkazy a ty se pak po ukončení smyčky spustí. Problém je ale v tom, že když připravuju SQL příkaz pro druhou tabulku, neznám id toho budoucího záznamu ze stejné relace pro první tabulku. Id se vytvoří až po provedení hromadného příkazu pro první tabulku.

Poradíte mi jak to vyřešit?
Joker
Profil
4ever:
Vyhledání titulku vlákna tady na diskusi hned na 2. místě (za tímhle dotazem) vrátí Jak získat auto_increment právě vkládaného řádku, kde jsem se tím zabýval.

edit: Chyba, pro různé tabulky to tak nepůjde.
Kajman_
Profil *
Asi si můžete v druhém si dávat pro třetí záznam něco jako
(LAST_INSERT_ID()+(2*@@auto_increment_increment))


Nejjistější je vkládat do první tabulky po jednom a do druhé už může být insert hromadný.
4ever
Profil
Kajman:
Aha, teď když už vím, že existuje tato funkce LAST_INSERT_ID() tak přece stačí zadat tu hodnotu přímo jako LAST_INSERT_ID()

Ve výsledku, po vložení prvního páru záznamů, kde první záznam v tabulce basic_info obsahuje hodnotu sloupce id==1, a první záznam v tabulce detaily_info obsahuje hodnotu sloupce info_id==1
4ever
Profil
Kajman:

Aha, teď už vím jak jste to myslel když jste říkal... Nejjistější je vkládat do první tabulky po jednom a do druhé už může být insert hromadný.

No a nešlo by to udělat úplně jinak? Mám nápad, ale zase nevím jak použít proměnnou z php a dostat ji do SQL příkazu.

Ještě jedna důležitá informace. Ta tabulka je jen na jedno použití. Všechny data se vkládají do prázdné tabulky a poté se již žádné data vkládat nebudou.

Dejme tomu, že chci získat takovýto příkaz
'INSERT INTO tbl_name (id_info,b,c,d) VALUES( 1,"b","c"),(2,"b","c"),(3,"b","c");


Dejme tomu, že data pro vložení jsou uložena v poli $data. Pak počet záznamů zjistím tak, že $count = count($data);

Pak mohu vypočítat id toho záznamu

A) buď

($count-$i)

Během sestavování jednotlivých záznamů bych připravoval hodnoty asi takto

$i++;
$sqlValuesArray[] = ' ($count-'.$i.'),"b","c" ';


Nebo
B)
(LAST_INSERT_ID()-$i )

$i++;
$sqlValuesArray[] = ' ($last_id-'.$i.'),"b","c" ';


Jediný problém je v tom, že $count = count($data); mohu provést až po dokončení smyčky. Definitivní počet záznamů je znám až po ukončení smyčky while.
4ever
Profil
Ups. Mám lepší řešení :-)

Založím tabulku temp pro dočasné záznamy.

Dovnitř smyčky pro přípravu dat vložím příkaz na vložení jednoho řádku do tabulky temp. Pak jen

$i=mysql_insert_id();
$sqlValuesArray[] = '('.$i.'),"b","c" ';


Smyčka bude nepatrně pomalejší, ale asi to nebude poznat. Mimo smyčku to pak provedu dva samostatné hromadné příkazy na vložení dat.
Kajman_
Profil *
Pokud máte vždy obě tabulky prázdné, tak si jednoduše generujte id přímo v php a nevyužívejte autoinkrementaci na straně db.

4ever:
Aha, teď když už vím, že existuje tato funkce LAST_INSERT_ID() tak přece stačí zadat tu hodnotu přímo jako LAST_INSERT_ID()

Ne, při vkládání více řádků jedním dotazem vrátí funkce id prvního vkládaného řádku.

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:

0