Ik heb twee kolommen. rit en boeking.
Bij boeking zit een foreign key van rit.
De bedoeling is dat boekingen van 30 dagen en later worden verwijderd.
Als ik deze query uitvoer dan krijg ik de foutmelding: mysql 1451 cannot delete or update a parent row
De query is:
DELETE FROM boeking WHERE DATEDIFF(NOW() ,Datum )>30;
Ik heb gezocht op het internet en kwam deze oplossing tegen:
SET foreign_key_checks = 0;
DELETE FROM boeking WHERE DATEDIFF(NOW() ,Datum )>30;
SET foreign_key_checks = 1;
De tweede query werkt wel,
mijn vraag is: is er ook een andere manier om boekingen te verwijderen?
Het bovenstaande lijkt mij niet wenselijk. De database klaagt dat er verwijzende records zijn naar bovenstaande tabel. Wat jij doet is deze klacht negeren en de records gewoon weggooien. Wat tot gevolg heeft dat er "dode records" in andere tabellen achterblijven.
Afhankelijk van de relatie zou je de constraint kunnen veranderen naar ON DELETE CASCADE, zodat deze verwijzende records automatisch worden opgeschoond (dit is eigenlijk het hele punt van een relationele database: zorgen dat je data consistent is en blijft). Maar dit hangt helemaal af van wat voor tabellen aan je boekingen tabel hangen.
Ik vraag me af, of de gebruiker van de applicatie wil dat boekingen van meer dan 30 dagen oud verwijderd worden.
Of dat hij ze simpelweg niet dagelijks wil zien.
Dat zou je namelijk oplossen door bij je SELECT-query's een WHERE datum > current_date + interval 30 DAY op te nemen.
Wat je weggooit, ben je definitief kwijt.
Ook als iemand 3 maanden later nog wat wil weten over een oude boeking, of je gebruiker in januari komt met de vraag om een rapport te kunnen maken over 2017.
Naast de filtering op 30 dagen, zou je zelfs voor boekingen die "echt" weg moeten, kunnen gaan voor een kolom "verwijderd" die dan voorzien wordt van de datum van het moment van verwijderen.
Dat maakt het probleem bij "per ongeluk verwijderd" een stuk kleiner