MySQL (15) - Odstraňujeme data
MySQL a odstraňování záznamů. Ale - je vůbec dobrý nápad něco v databázi mazat? Nedalo by se to obejít? Přečtěte si!
26.4.2005 15:00 |
Petr Zajíc
| Články autora
| přečteno 55334×
Protože jsme se v předchozích dvou dílech věnovali příkazům, pomocí
nichž lze data do MySQL vkládat a upravovat, asi nikoho nepřekvapí, že
dnes se budeme věnovat mazání záznamů.
Příkaz DELETE
MySQL má pro odstranění záznamů z tabulky příkaz DELETE. Ten
odstraní nula nebo více řádků. Jeho
nejjednodušší forma je:
delete from [názav
tabulky];
Příkaz uvedený výše odstraní z tabulky všechny záznamy. Pozor, v
některých DBMS je přípustná i forma příkazu s hvězdičkou:
delete * from [názav
tabulky];
kterou však MySQL nevezme, a příkaz takto napsaný by skončil chybou.
Samozřejmě, málokdy budete chtít odstranit z tabulky všechny záznamy.
Mnohem častější bude situace, kdy chcete vybrat jen nějaké řádky a ty
odstranit. O takové situaci platí to, co bylo řečeno v minulém díle.
Lehce to shrňme. Příkaz DELETE může obsahovat klauzuli WHERE, která
omezí mazané řádky na nějakou podmnožinu z celkového počtu pomocí
podmínek. Lze tedy například napsat:
delete * from faktury
where cena = 500;
delete from zakaznik where id = 156;
Rovněž lze omezit maximální počet řádků, které bude třeba smazat,
pomocí klauzule LIMIT. Má-li být smazán nejvýše jeden řádek, lze tedy
přepsat příkazy výše ve smyslu:
delete * from faktury
where cena = 500 limit 1;
delete from zakaznik where id = 156 limit 1;
Moc doplňujících informací se k příkazu DELETE napsat nedá. Má
pochopitelně nějaké ty přepínače, o nichž je zmínka v manuálu.
DELETE však není jediný způsob, jak v MySQL odstraňovat záznamy.
Příkaz TRUNCATE TABLE
TRUNCATE TABLE je příkaz, který odstraňuje všechny záznamy v
tabulce, přičemž definici tabulky samotné ponechává. Následující dva
příkazy budou tedy totožné:
delete from faktury;
truncate table faktury;
Proč tedy existují na jednu akci dva různé příkazy? Především proto,
že příkaz TRUNCATE je mnohem rychlejší. Jelikož ví, že bude muset
smazat celou tabulku, nemusí tento příkaz procházet a mazat řádky po
jednom. U extrémně velkých tabulek je toto zrychlení markantní. Tento
příkaz však nevrací počet odstraněných řádků.
Problémy a jak je řešit
Se samotným mazáním řádků v tabulkách obyčejně problémy nebývají.
Otázka však je, jak smazání ovlivní data nebo aplikace, které s daty
pracují. Potíž je v tom, že jednou smazaný řádek již nelze nijak
obnovit. Další pozoruhodná potíž spočívá v tom, že data v jedné
tabulce mohou souviset s daty v tabulce jiné (o tom ještě v seriálu
uslyšíme). Ukažme si tedy, jak se to dá v praxi obejít.
Pozn.: Vnímavý čtenář namítne, že i
smazaný záznam lze obnovit, pokud je operace součástí transakce. To je
pravda. Zmíníme se o tom jindy. Rovněž je pravda, že data v
souvisejících tabulkách lze
efektivně spravovat pomocí referenční integrity. Nicméně, obecný
problém s mazáním nic z toho úplně neřeší.
Stornovací záznamy
Představte si na chvíli, že došlo k chybě v nějakém bankovním systému a
nedopatřením vám někdo odečetl prostředky z běžného účtu. Mohlo se tak
stát pomocí následujícího příkazu MySQL:
insert into
pohyby_na_uctu (ucet, datum, castka) values ('123456', '2005-04-25
12:00:00', -50000);
Právě byste zchudli o 50 000,- Kč. Jenomže na chybu by se přišlo.
Běžně v takových situacích nedochází
k tomu, že by se záznam o odečtení
prostředků prostě vymazal - to by totiž vedlo k tomu, že už se
nikdo nedozví, co se vlastně stalo. Namísto příkazu:
delete from
pohyby_na_uctu where ucet='123456' and datum = '2005-04-25 12:00:00'
and castka = -50000 limit 1;
tedy dojde nejspíš ke vložení dalšího záznamu s opačnou hodnotou
částky:
insert into
pohyby_na_uctu (ucet, datum, castka) values ('123456', '2005-04-25
12:10:00', 50000);
Příznaky
Někdy je k vidění následující technika: Řádky se fyzicky neodstraňují,
místo toho se jim nastaví hodnota nějakého zvlášť k tomu určeného
sloupce (příznaku) a nechají se být. Nevýhoda tohoto přístupu spočívá
pochopitelně v tom, že s tím musejí aplikace počítat; výhoda na druhou
stranu je ta, že "smazání" lze kdykoli vrátit zpět. Namísto příkazu:
delete from knihy where
rok_zakoupeni = 1999;
by se v aplikaci používající tuto techniku zapsalo něco ve smyslu:
update knihy set deleted
= 1 where rok_zakoupeni = 1999;
Pokud byste si to chtěli do budoucna rozmyslet, můžete provést další
příkaz UPDATE. Aplikace by pochopitelně musela počítat s tím, že nesmí
vracet všechny knihy, ale jen ty, které NEMAJÍ nastavenou jedničku ve
sloupci DELETE.
Přesun jinam
To je další oblíbená možnost: Záznam je sice z požadované tabulky
smazán, ale je přemístěn do jiné tabulky, která slouží jako archiv. S
vědomostmi, které jsme v tomto seriálu zatím načerpali, bychom to mohli
napsat pomocí dvojice příkazů INSERT a DELETE nějak takto:
create table if not
exists archiv_knih like knihy;
insert into archiv_knih select * from knihy where rok_zakoupeni = 1999;
delete from knihy where rok_zakoupeni = 1999;
Výhody a nevýhody? V databázi se bude skladovat mnohem více
tabulkek, což je nevýhodné. Ale každý smazaný záznam bude v archivu,
což je zase velmi výhodné. Tabulka, do níž se v takovém případě
přesouvá, by měla mít stejnou strukturu jako tabulka, z níž se bude
mazat. Pomocí CREATE TABLE ... LIKE je velmi jednoduché toho dosáhnout.
Logování
Je rovněž možné si někam (třeba do jiné tabulky) ukládat záznamy o
datu, čase a uživateli, který něco smazal. Tento postup sice nevede k
tomu, že by se smazaný řádek dal nějak odstranit, nicméně vede k tomu,
že je alespoň možné zjistit, kdo smazání provedl.
V příštím díle našeho seriálu se podíváme na některé speciality,
které provázejí příkazy pro manipulaci s daty.
Verze pro tisk
|
Příspívat do diskuze mohou pouze registrovaní uživatelé.
|
|

Vyhledávání software

Vyhledávání článků
28.11.2018 23:56 /František Kučera Prosincový sraz spolku OpenAlt se koná ve středu 5.12.2018 od 16:00 na adrese Zikova 1903/4, Praha 6. Tentokrát navštívíme organizaci CESNET. Na programu jsou dvě přednášky: Distribuované úložiště Ceph (Michal Strnad) a Plně šifrovaný disk na moderním systému (Ondřej Caletka). Následně se přesuneme do některé z nedalekých restaurací, kde budeme pokračovat v diskusi.
Komentářů: 1
12.11.2018 21:28 /Redakce Linuxsoft.cz 22. listopadu 2018 se koná v Praze na Karlově náměstí již pátý ročník konference s tématem Datová centra pro business, která nabídne odpovědi na aktuální a často řešené otázky: Jaké jsou aktuální trendy v oblasti datových center a jak je optimálně využít pro vlastní prospěch? Jak si zajistit odpovídající služby datových center? Podle jakých kritérií vybírat dodavatele služeb? Jak volit vhodné součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně datové centrum spravovat? Jak co nejlépe eliminovat možná rizika? apod. Příznivci LinuxSoftu mohou při registraci uplatnit kód LIN350, který jim přinese zvýhodněné vstupné s 50% slevou.
Přidat komentář
6.11.2018 2:04 /František Kučera Říjnový pražský sraz spolku OpenAlt se koná v listopadu – již tento čtvrtek – 8. 11. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma umění a technologie, IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
4.10.2018 21:30 /Ondřej Čečák LinuxDays 2018 již tento víkend, registrace je otevřená.
Přidat komentář
18.9.2018 23:30 /František Kučera Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
9.9.2018 14:15 /Redakce Linuxsoft.cz 20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business.
Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář
12.8.2018 16:58 /František Kučera Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář
16.7.2018 1:05 /František Kučera Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář
Více ...
Přidat zprávičku
 Poslední diskuze
31.7.2023 14:13 /
Linda Graham iPhone Services
30.11.2022 9:32 /
Kyle McDermott Hosting download unavailable
13.12.2018 10:57 /
Jan Mareš Re: zavináč
2.12.2018 23:56 /
František Kučera Sraz
5.10.2018 17:12 /
Jakub Kuljovsky Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?
Více ...
|