Autor Zpráva
marian80
Profil
Zdravím znova. Je možné pomocou DiBi aktualizovať viaceré záznamy v DB ale použiť pri tom iba jeden prístup, požiadavku?
Mám tabuľku TOVAR, v nej mám stĺpec POCET (typ INT). Teda počet kusov jednotlivých tovarov. A teraz potrebujem pridať ku každému tovaru rôzne nové počty, napr. k tovaru A 5ks, k tovaru B 12ks, tovar C 3 atď.
Napadlo ma vytiahnuť pôvodný počet jedného tovaru, pripočítať určité číslo a pomocou UPDATE ho znova nahrať do DB. To sú ale dve požiadavky na jednu položku tovaru. Ak bude položiek sto, tisíc, tak už je to veľká záťaž pre databázu, alebo nieje?
Ešte by možno bolo riešenie jedným QUERY vytiahnuť potrebné ID tovarov a ich POCTY, vložiť do Array, v PHP pripočítať potrebné nové počty, z tých potom vytvoriť druhý Array a to nejako všetko naraz jedným QUERY zase aktualizovať pomocou UPDATE. Len to absolútne neviem či je vôbec možné a ak áno, ako na to.
Keeehi
Profil
Vynechávám teď dibi, jelikož to je jen vrstva nad sql.

Ano, je možné to udělat jedním dotazem. Dokonce ani není třeba data tahat do PHP.
UPDATE
    tovar
SET
    pocet = CASE
        WHEN tovar_id = 'A' THEN pocet + 5
        WHEN tovar_id = 'B' THEN pocet + 12
        WHEN tovar_id = 'C' THEN pocet + 3
    END
WHERE
    tovar_id IN ('A', 'B', 'C')
Ale je to takové, no né moc hezké. Taky nevím, jak to bude s výkonem databáze. Nevím, zda umí nějak optimalizovat ten obří case co tam vznikne.

Druhá možnost je využít insert. V takovém případě si budeš muset ty data načíst (jedním dotazem), změnit v PHP a jedním dotazem je zase můžeš zapsat.
INSERT INTO
    tovar (tovar_id, pocet)
VALUES
    ('A', 15),
    ('B', 22),
    ('C', 13)
ON DUPLICATE KEY UPDATE
    pocet=VALUES(pocet)
Klíčové je tam to ON DUPLICATE KEY UPDATE. Normálně by takový insert selhal (předpokládám primární klíč na sloupci tovar_id), jelikož už takové záznamy s daným IDčkem jsou v databázi. Takhle ale neselže a místo přidání nových řádků jejich hodnotu jen upraví. Lehká nevýhoda je ta nutnost načtení do PHP. Taky by bylo potřeba tu tabulku zamknout, protože pokud by se změnily záznamy v ní během toho procesu, pak by ti ty produkty mohly "virtuálně" přibýt/zmizet. Můj osobní odhad je, že tahle verze se bude databázi líbit o něco více. Zkus otestovat obě a uvidíš, která je pro tvůj případ lepší.
Kajman
Profil
marian80:
Ak bude položiek sto tisíc

Pokud se mění hodně řádků, udělal bych si pomocnou (asi temporary) tabulku. Do ní dal insertem (to dibi umí) nebo load from file podklady pro změnu a pak lze napsat update čerpající data z této pomocné tabulky.

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