mysql: hoe error 1451 oplossen?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Robert Jansen

Robert Jansen

10/06/2017 19:29:42
Quote Anchor link
Hallo,

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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
DELETE FROM boeking WHERE DATEDIFF(NOW() ,Datum )>30;

Ik heb gezocht op het internet en kwam deze oplossing tegen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
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?

alvast bedankt
 
PHP hulp

PHP hulp

14/03/2025 04:05:35
 
Ben van Velzen

Ben van Velzen

10/06/2017 21:32:39
Quote Anchor link
Heb je je relaties verkeerd om gelegd? Dit hoort niet te gebeuren.
 
Thomas van den Heuvel

Thomas van den Heuvel

10/06/2017 21:32:43
Quote Anchor link
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.
Gewijzigd op 10/06/2017 21:59:35 door Thomas van den Heuvel
 
Ivo P

Ivo P

11/06/2017 15:03:15
Quote Anchor link
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
 
Thomas van den Heuvel

Thomas van den Heuvel

11/06/2017 16:06:33
Quote Anchor link
Of gewoon een status "deleted" invoeren, en alle queries voorzien van WHERE deleted = 0.

Los hiervan, foreign key checks uitzetten om gegevens geforceerd weg te gooien die anders niet weggegooid konden worden kan nooit de oplossing zijn.
 



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.