MySQL Normalisatie - Data verwijderen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Top Low-Code Developer Gezocht!

Bedrijfsomschrijving Unieke Kansen, Uitstekende Arbeidsvoorwaarden & Inspirerend Team Wij zijn een toonaangevende, internationale organisatie die de toekomst van technologie vormgeeft door het creëren van innovatieve en baanbrekende oplossingen. Ons succes is gebaseerd op een hecht en gepassioneerd team van professionals die altijd streven naar het overtreffen van verwachtingen. Als jij deel wilt uitmaken van een dynamische, vooruitstrevende en inspirerende werkomgeving, dan is dit de perfecte kans voor jou! Functieomschrijving Als Low-Code Developer ben je een cruciaal onderdeel van ons team. Je werkt samen met collega's uit verschillende disciplines om geavanceerde applicaties te ontwikkelen en te optimaliseren met behulp van Low-code

Bekijk vacature »

Tobias Tobias

Tobias Tobias

26/05/2015 14:21:20
Quote Anchor link
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?
 
PHP hulp

PHP hulp

28/03/2024 17:33:22
 
- wes  -

- wes -

26/05/2015 14:33:44
Quote Anchor link
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?
 
Tobias Tobias

Tobias Tobias

26/05/2015 14:46:26
Quote Anchor link
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.
 
- wes  -

- wes -

26/05/2015 14:46:43
Quote Anchor link
juistem
 
Tobias Tobias

Tobias Tobias

26/05/2015 15:05:18
Quote Anchor link
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
 
Johan de wit

johan de wit

26/05/2015 15:09:03
Quote Anchor link
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.
 
- wes  -

- wes -

26/05/2015 15:15:45
Quote Anchor link
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)'.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

27/05/2015 10:18:02
Quote Anchor link
- 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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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)


En:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
DELETE FROM bereidingen
    WHERE datumkolom < CURRENT_DATE - INTERVAL 3 YEAR
 
- wes  -

- wes -

27/05/2015 11:39:10
Quote Anchor link
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.
 
Tobias Tobias

Tobias Tobias

27/05/2015 12:10:59
Quote Anchor link
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?
 
- wes  -

- wes -

27/05/2015 12:58:13
Quote Anchor link
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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.