Olykor előfordulhat, hogy egy hibás program megduplázza (triplázza, kvadplázza) a rekordokat egy adatbázistáblában. MySQL egyszeregy következik.
Nagyon egyszerűen elkerülhetjük ezt az esetet. A bejegyzés végén persze azt is elárulom, hogyan töröljük ki a felesleget, ha már megtörtént a dolog, ám előbb a megelőzés: azokra a mezőkre, amelyeket együtt csak egyszer akarunk látni (pl. termékazonosító, ár és ár érvényessége) csinálunk egy közös unique indexet.
ALTER TABLE `arak` ADD UNIQUE `egyedi` ( `termekid` , `ar`, `ervenyes` )
Ezzel biztosítottuk, hogy ugyanolyan felállás az adott mezőket tekintve nem fordulhat elő egy újabb rekordban. Ezután csak annyi a dolgunk, hogy eldöntsük, mit tegyünk hasonló rekord beszúrásakor. Ugyebár két lehetőségünk van, a felülírjuk a már létező rekordot az új adatokkal, vagy hagyunk mindent a régiben. A titkos harmadik lehetőség a kivétel generálása.
1. INSERT INTO `arak` SET `termekid`=15, `ar`=990, `ervenyes`=’2009-08-01 0:00:00′ ON DUPLICATE KEY UPDATE `termekid`=15, `ar`=990, `ervenyes`=’2009-08-01 0:00:00′
Mi történik itt? Az “ON DUPLACATE KEY UPDATE” kifejezés annyit csinál, hogy ha már létezik a táblában olyan kulccsal (vagy unique index-szel) rekord, amit be akarunk szúrni, akkor megelőzi a beszúrást, és felülírja a megadott mezők értékét. Esetünkben a frissítéshez minden mezőt felülírunk, ami az INSERT-ben eredetileg szerepelt.
Megjegyzem ennek a módszernek csak akkor van értelme, ha a fenti három mellett vannak még más mezők is a táblában. Például egy megjegyzés mező, vagy egy akciós flag, amit egyáltalán felül tudunk írni. Hiszen ha ilyen nincs, akkor a rekord nem változik. Apropó nem változik…
2. INSERT IGNORE INTO `arak` SET `termekid`=15, `ar`=990, `ervenyes`=’2009-08-01 0:00:00′
Itt az IGNORE kulcsszó hatására a MySQL a beszúrás során fellépő hibákat figyelmeztetésként kezeli, és nem akasztja meg az egész tranzakciót, például. Ezzel a módszerrel tehát azt érhetjük el, hogy a beszúrt rekord ütközés esetén ne íródjon felül, tehát az új rekord beszúrása ne történjen meg, és ne legyen hatással a régire.
3. INSERT INTO `arak` SET `termekid`=15, `ar`=990, `ervenyes`=’2009-08-01 0:00:00′
Ez a harmadik eset, ilyenkor – már létező kulcs esetén – a végrehajtás hibát fog generálni. Ez is hasznos lehet olykor.
Mindhárom módszer nagyon fontos olyan esetekben, amikor például különböző adatbázisokat szinkronizálunk.
Ha viszont már elb*sztuk, és a táblánk tele van mindenféle hasonló rekorddal, amelyekből nekünk csak egy kell per fajta, akkor itt egy kis elsősegély:
CREATE TABLE `uj_arak` AS SELECT * FROM `arak` GROUP BY `termekid` , `ar`, `ervenyes`
Ezzel létrehozunk egy ugyanolyan táblát, mint az eredeti, és beletettük az eredetiből az egyedi rekordokat – legalábbis amelyeknél a termekid, az ar és az ervenyes mező együttesen egyedi. Ez lesz a cseretáblánk.
Nem szabad megfeledkeznünk arról, hogy az indexek ilyenkor nem jönnek át a régi táblábból! Ezeket újra el kell vennünk.
Ha ez megtörtént, akkor már csak a cserét kell végrehajtanunk.
DROP TABLE `arak`;
RENAME TABLE `uj_arak` TO arak;
Ennyi az egész.




