Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Integrita dat v MySQL

Mám tabulky A, B v MySQL, obsahují sloupec id jako primární klíč. Pak mám tabulku C vytvořenou skriptem, která má dva sloupečky odkazující se na A.id a B.id, které jsou označené jako FOREIGN KEY ... ON DELETE CASCADE ON UPDATE CASCADE (zachycuje vazby mezi těmito klíči). Je zajištěno, že v době přidávání záznamu do tabulky C oba klíče v tabulkách A, B existují, jinak se záznam nevytvoří (jednak je to zajištěno skriptem, který data do tabulky sype, jednak ani MySQL nepovolí záznam vytvořit, pokud hodnota neexistuje v tabulce A/B).

Šéf tvrdí, že použití FOREIGN KEY je vyloučeno, protože prý může dojít k narušení konzistence dat v DB. Ponechme stranou jaký smysl má DB, ve které jsou nesmyslná nekonzistentní data. Zajímá mne, jestli může nějakým způsobem dojít k tomu, aby se záznam v tabulce C začal odkazovat na neexistující záznam v tabulkách A/B, když jsem použila klauzuli ON DELETE CASCADE...? Až dosud jsem měla za to, že ta integritu dat zajistí (a pokud ano, tak jakým způsobem by k tomu mohlo dojít). Ono pracovat s DB, která obsahuje několik databází, každá databáze desítky tabulek, je mezi nimi fůra vazeb (a to i tak, že se odkazují do tabulek v jiných DB), ale zásadně se FOREIGN KEY nepoužívá je docela lahůdka, zvláště, když neexistuje k tomu žádná dokumentace.

Předmět Autor Datum
Foreign key slouží k tomu, aby nedošlo k narušení konzistence v DB. Naopak bez použití foreign key m… poslední
Jan Fiala 19.06.2012 16:02
Jan Fiala

Foreign key slouží k tomu, aby nedošlo k narušení konzistence v DB. Naopak bez použití foreign key můžeš nekonzistenci v DB jednoduše vytvořit smazáním záznamu v tabulce A nebo B. Použití foreign key by tomu zabránilo.
Ale osobně bych byl opatrný s Cascade Delete apod. pokud to nemá opravdu význam. V normální praxi to nepotřebuješ. Pokud se máš nastaven foreign key a pokusíš se smazat záznam v tabulce A, který je použit, skončí to chybou. S CASCADE delete se automaticky smažou i záznamy v tabulce C, které na daný záznam odkazují. Tohle může být nebezpečné, protože smazáním záznamu v tabulce A smažeš třeba polovinu obsahu tabulky C.

Koukám, že tvůj šéf je opravdu odborník na svém místě, zvlášť s tím ukládáním dat, které se používají pro vazby do blobu.

Zpět do poradny Odpovědět na původní otázku Nahoru