PHP (42) - Odstraňujeme databázová data
Pakliže se Vám data v databázi nelíbí, je tento díl seriálu přesně pro vás. Dozvíte se totiž, jak je mazat.
25.8.2004 15:00 |
Petr Zajíc
| Články autora
| přečteno 38642×
Někdy bývá potřeba data z databáze nemilosrdně odstranit. Pojďme si
povědět, jak na tuto destruktivní činnost jít.
Smazat je smazat
Ideální je udělat následující zkušenost metodou pokus-omyl, protože
potom
si to zapamatujete. Data k odstranění budou SKUTEČNĚ odstraněna. Takže
špatně napsaný odstraňovací dotaz Vám může celou databázi rozhodit.
Proto opravdu profesionální databázové aplikace přímé mazání záznamů
moc nepoužívají. V profi prostředí se většinou používá jeden nebo
kombinace následujících přístupů:
- Někdy se místo odstraňování záznamů vkládají záznamy s opačnými
hodnotami (například faktura a stornodoklad).
- Jindy se řádky nemažou, ale nastavuje se jim zvláštní příznak
(existuje dejme tomu sloupec obsahující logickou hodnotu DELETED),
aplikace pochopitelně musí být tomuto trendu přizpůsobena.
- Ještě jindy se řádky sice z originální tabulky odstraní, ale
nezmizí úplně, nýbrž jsou přesunuty do jiné tabulky (ta může mít
stejnou strukturu jako tabulka původní).
- Konečně se dělá to, že se protokolují odstraňovací dotazy (kdo a
kdy to udělal), aby se případný viník mohl alespoň najít a zlynčovat.
Všimněte si, že první tři přístupy mají tu výhodu, že "smazání" lze
vrátit zpět. Jsou to ale obecně poměrně pokročilá řešení, která mají
také své nevýhody. Kdybyste se do toho chtěli někdy pouštět, měli byste
vědět, že:
- to bude obecně pomalejší než prosté odstranění dat
- to bude vyžadovat větší prostor v databázi
- bude to náročnější na programování
- se to dá hodně zjednodušit použitím "chytřejších" databází
Pokud použijete PHP a MySQL a rozhodnete se pro některé z výše
uvedených pokročilých řešení, budete si je muset víceméně napsat.
Pozn.: Tento typ úloh se nejlépe
realizuje s databázemi, které umějí používat uložené procedury a
triggery. MySQL zatím nic z toho neumí, měl by se to objevit v
"pětkových" verzích. PostgreSQL umí obojí. Uložená procedura je
programový kód, který se píše pomocí SQL a spouští se na databázovém
serveru. Trigger je uložená procedura, která se na nějaké tabulce
spustí vždy, když na ní dojde k definované operaci měnící data. Pomocí
procedur a triggerů například vůbec není problém napsat kód, který při
odstranění dat uloží kopii smazaných dat nějam jinam. Což je přesně
jedna z metod popsaných výše. PHP o tom vůbec nemusí vědět.
Co umí MySQL
Především je potřeba si uvědomit, že někdy není nutné odstraňovat
celý záznam (řádek). Často potřebujeme odstranit pouze hodnoty v
nějakých sloupcích. K tomu slouží příkaz UPDATE, kterým můžeme nastavit
hodnotu ve sloupci na NULL, neboli neznámou. Takže následující příkaz
jazyka SQL je zcela legitimní:
UPDATE tabulka SET
sloupec=NULL
O speciální hodnotě NULL jsme již v seriálu mluvili. Je to hodnota neznámá, takže se chová zvláštně.
Počítejte s tím, že žádná hodnota NULL se nerovná jiné hodnotě NULL a
že výsledek většiny matematických operací, jichž se účastní NULL jako
jeden z členů je zase NULL. (Například NULL+3=NULL, protože když k
neznámému číslu přičteme trojku, výsledek je zase neznámý). Zdůrazňuji
to proto, že je snadné na to zapomenout. Tak například v tabulce
zaměstnanců bychom si mohli myslet, že:
SELECT * FROM
zamastnanci WHERE PLAT>10000
SELECT * FROM zamestnanci WHERE PLAT<=10000
vrátí dohromady všechny zaměstnance. Tak to nemusí nutně být;
jestliže jsou ve sloupci PLAT povoleny hodnoty NULL (výše platu je
neznámá!) mohou existovat řádky, které nejsou vráceny ani prvním, ani
druhým dotazem. Takže pozor na to.
DELETE
Ke "klasickému" promazávání řádků z tabulky slouží příkaz DELETE.
Jeho nejjednodušší syntaxe je:
DELETE FROM název_tabulky
Kterýžto příkaz odstraní všechny řádky z tabulky. Prakticky vždy se
ale používá buďto ve spojení s klauzulemi WHERE nebo LIMIT. DELETE je
opakem INSERTu a platí o něm plnou měrou to, co bylo řečeno v úvodu.
TRUNCATE TABLE
je příkaz podobný DELETE s tím rozdílem, že odstraňuje a znovuvytváří
celkou tabulku. V praxi to může být podstatně rychlejší než použití
DELETE, protože DELETE postupuje řádek po řádku. TRUNCATE TABLE
se ovšem nedá použít s WHERE, protože maže vždy všechny záznamy.
Pozn.: Fungování TRUNCATE TABLE v MySQL
se hodně měnilo v jednotlivých verzích databáze, takže pokud si nejste
jisti co dělá vámi používaná verze MySQL, podívejte se do manuálu.
DROP TABLE
Jak po použití TRUNCATE TABLE, tak po použití DELETE tabulka jako
taková v databázi samozřejmě zůstane, i kdyby měla být prázdná. Pokud
budete chtít odstanit tabulku včetně její struktury, je tu příkaz DROP TABLE.
Ten je pravým opakem CREATE TABLE.
DROP DATABASE
jak asi tušíte, tohle je nejsilnější "mazací" příkaz. Odstraní z
databáze všechny tabulky, odstraní databázi jako takovou a odstraní
fyzicky všechny soubory operačního systému, které byly pro provoz této
databáze potřeba. Tohle by se mělo provádět jen ve výjímečných
případech.
Pozn.: A v praxi si to asi
nevyzkoušíte, protože na většině webhostingů k provedení tak
destruktivní akce nebudete mít potřebná přístupová práva.
Mazání v PHP+MySQL
Už toho není mnoho, co bych mohl dodat. Rovněž pro zadávání
odstraňovacích dotazů se v PHP používá funkce mysql_query. Platí pro ni
de facto to, co jsme uvedli v minulém dílu o UPDATE. Stručně zopakujme:
- mysql_affected_rows vrací počet aktualizovaných záznamů nebo -1,
pokud dotaz selhal.
- mysql_query vrací TRUE pokud se příkaz povedl, FALSE pokud
selhal.
- Pokud odstranění záznamu nějakým způsobem závisí na hodnotách
zadaných uživatelem, měly by se tyto hodnoty pečlivě zkontrolovat ještě
předtím, než je dotaz proveden.
Osobně se použití příkazu DELETE ve skriptech PHP dost bráním.
Většinou to povoluji pouze v nějakém administrátorském rozhraní
vybraným uživatelům. Využívám toho, že v DELETE lze použít jak klauzuli
WHERE, tak i LIMIT. Ani tady dnes mazání neuvidíte, nepovedlo se mi
vymyslet dostatečně praktickou a zároveň bezpečnou aplikaci, která by
to ilustrovala.
V příštím díle se podíváme na některé tipy, které Vám pomohou zvýšit
rychlost databázově závislých aplikací.
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 ...
|