Ignorantské INSERTy

napísal , 29 Feb 2012 [ SQL ]

INSERT? Fuck that!
3 malé tipy, s ktorými si ušetríte pár riadkov kódu a budete takí ťažkí frajeri, že sa už nezbavíte ženských (chlapov, v prípade, že to číta nejaká programátorka (do they even exist?:)).

Predstavte si, že vaša životná púť dospeje do situácie, kedy chcete niečo zapísať do MySQL tabuľky, ale nechcete sa zapodievať kontrolami, či daný záznam už existuje. Čo s tým..

1) Chcem vložiť riadok do tabuľky. Ak už existuje, nič sa nebude zapisovať.

INSERT IGNORE INTO vajcia (id, nazov, kaliber)
VALUES(NULL, 'Vajčisko', 'masívny')

Úplne normálny INSERT s tým rozdielom, že keď ak by sa bili primárne kľúče alebo unikátne kľúče (čiže záznam už existuje), query sa odignoruje. Vloženie sa odignoruje alebo riadok sa uloží neočakávaným spôsobom aj ak bude obsahovať iné chyby, na čo si treba dávať pozor.

2) Chcem vložiť riadok do tabuľky. Ak už existuje, chcem update-núť jeho údaje

INSERT INTO checkins (id, id_user, id_venue, count, last_checkin)
VALUES (NULL, 230, 6434, 1, NOW())
ON DUPLICATE KEY UPDATE count = count + 1, last_checkin = NOW()

Príklad ukazuje niečo ako "check in" na 4square. Pri prvom raze sa vloží záznam, že som na nejakom mieste vôbec bol, pri ostatných razoch sa zvýši počítadlo návštev a čas posledného check-in-u sa aktualizuje. Je to v podstate INSERT a UPDATE spojený do jednej query.

3) To isté čo druhý prípad, s malým rozdielom
Ak by som vkladal nejaký dlhý text, musel by som ho v predchádzajúcom spôsobe zopakovať 2x (raz v INSERTE a raz v UPDATE časti). Pri extrémne dlhých textoch by nám to teoreticky mohlo vadiť. Situáciu zachráni REPLACE.

REPLACE INTO poznamka (id, id_projekt, datum, text)
VALUES (NULL, 42, '2012-12-12', 'Všetko som vybavil, môžme spustiť tú apokalypsu... [1MB dalsich kecov]')

Je tu však jedna zradafeature. Ak záznam existuje, vymaže sa a vloží sa nový, čiže sa zmení aj primárny kľúč (ak je AUTO_INCREMENTovací).

Bonus
Prvý prípad s INSERT IGNORE sa dá riešiť trocha lepším, ale divnejším spôsobom, použitím ON DUPLICATE KEY UPDATE, takto:

INSERT INTO vajcia (id, nazov, kaliber)
VALUES(NULL, 'Vajčisko', 'masívny')
ON DUPLICATE KEY UPDATE id = id

Výhoda je, že sa neignorujú žiadne chyby, iba duplicitné kľúče. Nevýhodou je trocha mätúca syntax.

Teraz si už len treba dávať pozor na tie ženské.

napísal , 29 Feb 2012

10 komentárov

komentuj ku každému komentáru sa v databáze ukladá iba meno, text a dátum, iba za účelom zobrazenia pod článkom
neukladá sa email, IP adresa ani informácie o prehliadači a údaje sa nepoužívajú na reklamu, newsletter, na žiadnu ekonomickú aktivitu, nikam sa neposielajú, sú v databáze len aby sa mohli zobraziť pod článkom

Archivovaný archív je bez komentárov. Radšej.