Hallo,

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?
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?
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.
juistem
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
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


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


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?

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

Onbedoeld niet als je correct format en inricht.

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.

Reageren