Zdravím.
Mojim problémom od počiatkov práce s MySQL bolo mazanie údajov z tabuliek. Možno sa to deje len mne (neverím) alebo neviem nájsť ten správny príkaz. Síce som používal príkaz DELETE, ale po aplikovaní do praxe bol výsledok taký, že mi namiesto mazania údajov (zmenšovania veľkosti databázy) MySQL urobilo len to, že to v súbore phorum.MYD čudným spôsobom skrylo.
Takže spôsob takéhoto mazania som rýchlo zamietol. A namiesto toho som si napísal skript, ktorý najskôr načíta riadky z tabuľky a vloží ich do temp tabuľky, ktorú nasledovne prekopíruje do originálnej tabuľky.
Jednoduché riešenie ale má to háčik.
Tu je úplný skript na použitie:
http://matejtomcik.xf.cz/download/mtpstuff.zip
Háčik >> môže nastať situácia, kedy by sa skript z neurčitých príčin ďalej nepreložil, ale by sa "zasekol"? (Ja by som tak prišiel o všetky dáta v MySQL)
k mazani dat je v sql prikaz delete, tak ho k tomu pouzivej. jak ho ktera databaze provadi je vec implementace a s vysokou pravdepodobnosti je to dobre promysleny, tak do toho nevrtej (dokazes si predstavit, jak by to mazani bylo silene pomaly, kdyby se pri kazdym vymazu jednoho radku mel preskladat celej soubor s tabulkou o nekolika milionech radku?)
Matej Tomčík (matejtomcik.xf.cz)
Prikaz DELETE funguje tak, ze oznaci radky za smazane a uz k nim beznym SELECTem nemas pristup.
Pak pouzijes prikaz INSERT, ktery smazane radky prepisuje.
Timti zpusobem dochazi k tomu, ze databaze se nezmensuje, spise obcas narusta.
ALE, takze nedochazi k fragmentaci (pokud maji sloupce pevny rozmer a nepouzivaji pole typu BLOB, TEXT, ...) (= u disku, ze nekde vznika dira, kterou pak castecne system zaplni velkym souborem a zbytek da na konec disku; tj. rozdeli soubor na milion casti, v tomto pripade 2)
Premyslej. Co je rychlejsi? Nastavit priznak smazane nebo odstranit pole uplne a prepsat nejake dalsi promenne?
Pak je tu prikaz OPTIMIZE (nebo tak nejak, viz PHPmyAdmin), ktery smazane radky odstrani. Kdyz to volas 1/mesic, tak tento prikaz provede predchozi... nastavi promenne, radky uplne vyprazdni, ale provede to jen jednou pro X zaznamu.
Co se tyce presouvani do dalsich tabulek, to klidne delej. Script je takovy, ze nejdriv presunes a pak smazes. Ale stejny vyznam ma zalozit si sloupec, kde nastavis polozku pres UPDATE na typ = smazane a pri SELECT si vybiras polozky nesmazane. Pak samozrejme musis mit script, ktery nejakym zpusobem smazane polozky casem odstranuje nebo prepisuje.