MySQL Normalisatie - Data verwijderen
Ik heb een database waarin bereidingen van reagentia staan:
Tabelstructuur:
bereiding
- bereiding_id
- recept_id
- datum_tijd
- analist
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?
zoiets? of snap ik het verkeerd?
Bedankt! Weet ik in welke richting ik moet zoeken.
juistem
Ik blijf iedere dag weer nieuwe dingen bijleren ;-) Dat houdt het leuk en uitdagend
Tobias Tobias op 26/05/2015 15:05:18:
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 blijf iedere dag weer nieuwe dingen bijleren ;-) Dat houdt het leuk en uitdagend
Precies daar ben ik ook 1 van.
Tobias Tobias op 26/05/2015 15:05:18:
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 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)'.
- wes - op 26/05/2015 14:33:44:
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?
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:
Code (php)
1
2
3
4
5
2
3
4
5
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)
WHERE EXISTS
(SELECT 1 FROM bereidingen b
WHERE b.datumkolom < CURRENT_DATE - INTERVAL 3 YEAR
AND b.bereiding_id = i.bereiding_id)
En:
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.
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.