bereiding_ingredienten
- id
- bereiding_id
- ingredient_id
- volume
Nu wil ik een script maken die alle bereidingen ouder dan een bepaalde tijd (in dit geval 3 jaar, maar verder niet belangrijk), en de daarbij behorende bereiding_ingredienten. De enige methode die ik kan bedenken is:
- Selecteer alle bereidingen ouder dan opgegeven tijd
- Gooi de resultaten in een loop
- In de loop: Gooi alle bereiding_ingredienten weg met bereiding_id, en verwijder de bereiding zelf
Dit zal vast efficiƫnter in 1 query kunnen. Wie kan me daarbij helpen?
FK maken van bereiding_id in bereiding. Index maken van bereiding_id in ingredienten-table. Bij tablerelaties een ONDELETE CASCADE zetten op die bereiding_id in ingredienten-table.
Wat ik hieruit begrijp is dat je kunt instellen (in phpmyadmin?) dat als een rij uit bereiding verwijdert wordt, automatisch (ONDELETE CASCADE) de rijen uit bereiding_ingredient worden verwijdert waar dezelfde bereiding_id in voorkomt?
Bedankt! Weet ik in welke richting ik moet zoeken.
Ik hoopte al dat MySQL er iets voor zou hebben, maar ik had geen idee waarnaar ik moest zoeken.
Ik blijf iedere dag weer nieuwe dingen bijleren ;-) Dat houdt het leuk en uitdagend
Ik hoopte al dat MySQL er iets voor zou hebben, maar ik had geen idee waarnaar ik moest zoeken.
Ik blijf iedere dag weer nieuwe dingen bijleren ;-) Dat houdt het leuk en uitdagend
Ik hoopte al dat MySQL er iets voor zou hebben, maar ik had geen idee waarnaar ik moest zoeken.
Ik blijf iedere dag weer nieuwe dingen bijleren ;-) Dat houdt het leuk en uitdagend
heel goed :) let wel op dat je innodb gebruikt (of iig geen myisam) en dat je altijd je relaties betrekt op de koppeling. Dus denk altijd 'wat gebeurd er met deze rij, als de koppeling met dit veld X wordt verwijderd (ON DELETE) of gewijzigd (ON UPDATE)'.
FK maken van bereiding_id in bereiding. Index maken van bereiding_id in ingredienten-table. Bij tablerelaties een ONDELETE CASCADE zetten op die bereiding_id in ingredienten-table.
zoiets? of snap ik het verkeerd?
Een FK in een 1-n relatie hoort in de tabel aan de n-kant, dus precies andersom dan jij aangeeft.
Daarnaast is het niet verstandig om een ON DELETE CASCADE toe te passen, want dat heeft ook gevolgen als er onbedoeld een record verwijderd wordt.
Het kan in 2 queries:
DELETE FROM bereiding_ingredienten i
WHERE EXISTS
(SELECT 1 FROM bereidingen b
WHERE b.datumkolom < CURRENT_DATE - INTERVAL 3 YEAR
AND b.bereiding_id = i.bereiding_id)
En:
DELETE FROM bereidingen
WHERE datumkolom < CURRENT_DATE - INTERVAL 3 YEAR
Wat gebeurd er met je koppelrij als de parent wordt verwijderd, is een valide vraag. Je krijgt juist geen problemen omdat je de DB dit laat controleren ipv dat je hier zelf fouten mee kan maken.
Werkt de ON DELETE CASCADE altijd? Dus ook als ik bv via phpmyadmin een regel verwijder? Of alleen via een query in een script (zit daar uberhaupt verschil tussen?)
En als ik de bereiding_id aanpas in bereiding, verdwijnt dan de link met bereiding_ingredient?
Werkt altijd. Wijzigingen gaan via de ON UPDATE. Als je daar ook cascade zet zal de link blijven met de nieuwe waarde. Als je restrict zet kan je niet de parentid wijzigen als er een child gekoppeld zit.