Autor Zpráva
_Leopik 2x
Profil *
Zdravím,
mam otazku týkajúcu sa MySQL. Najlepšie a najrýchlejšie to asi bude, ak môj problém ilustrujem na príklade:
Tabulka Osoba:
+-----------------+
| Id     | MenoId |
+-----------------+
| 1      | 15     |
| 2      | 16     |
| 3      | 15     |
| 4      | 17     |
+-----------------+

Tabulka Mena:
+-----------------+
| Id     | Meno   |
+-----------------+
| 15     | Jan    |
| 16     | Marek  |
| 17     | Dusan  |
+-----------------+

Tabuľka Osoba obsahuje osoby, ktoré majú mená, ktoré sa nachádzajú v tabuľke Mena, teda Osoba(MenoId) odkazuje na Mena(Meno). Potreboval by som, aby ak zmažem záznam v Osobe, aby sa automaticky zmazal aj záznam v tabuľke Mena v prípade, ak už neexistuje žiadna iná referencia z Osoba na dané meno.

Teda napríklad ak zmažem riadok Osoba(Id) = 2, mal by sa tiež automaticky vymazať Marek z tabuľky Mena. Avšak ak zmažem z Osoba(Id) = 3, meno Jan by malo ostať zachované, pretože ešte stále existuje naňho nejaká referencia z Osoby (Osoba(Id) = 1).

Je to možné nejako dosiahnuť? Poprípade, ak to robím zlým spôsobom, môžte ma naviesť na ten správny?
Ďakujem
Kajman
Profil
Triggerem to nepůjde, protože nemůžete koukat do tabulky, kterou upravujete. Můžete např. udělat jeden delete pro smázání osoby. A semtam nebo i pokaždé hned po smazání osoby ještě i mazat z tabulky mena, která nejsou použitá - něco jako

delete from m
using  mena m
left   join osoba o
    on m.id=osoba.menoid
where  o.menoid is null

Ale osobně bych z tabulky Mena vůbec nemazal.
_Leopik 2x
Profil *
Mhm, tak dik. Doposiaľ som z tabuľky Mena nemazal nič. Tá tabuľka nikdy nebude priveľmi veľká (zhruba +100 záznamov za rok) a 90% tých záznamov nebude treba mazať takže to znamená, že za rok vznikne možno nejakých +10 riadkov, na ktoré nie je nikde odkazované. Nepáčil sa mi ten dizajn pretože celkovo nevyzerá "správne".

Zrejme to teda asi necham tak, ak uvidím, že tých zbytočných záznamov je viac ako sa očakávalo, tak to budem riešiť tým mazaním.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0