Hi, ik ben een klein systeempje aan het maken waarbij ik 2 tabellen heb.
Tabel 1: Hier staat alle informatie in van de klanten
Tabel 2: De toegevoegde problemen met een kolom (TID, dit is het id van de klant die het heeft toegevoegd.)
Elk probleem & klant heeft een ID. Nu wil ik het zo maken dat als je een klant verwijderd je ook meteen in Tabel 2 alle problemen verwijderd waar TID gelijk is aan $_GET['id'].
Moet ik dat dan in 2 keer doen? of hoe kan ik dat in 1 query aanpakken?
Als je MySQL 5 hebt met de InnoDB engine dan kan het met 1 query. Ik denk echter dat je de MyISAM engine gebruikt (vaak standaard), dus dat houd in dat je dan wel in 2 keer moet doen, een DELETE query werkt niet met een JOIN heb ik getest.
Dus je zal toch moeten zorgen dat je of de InnoDB engine gaat gebruiken, of overstappen op een ander type (postgresql) database als je echt wil dat je het met 1 query kan doen.
Dit doe je niet met behulp van php. Als je met een goed datamodel werkt zorg je namelijk voor een foreign key constraint op de 'klanten' tabel in de 'problemen' tabel (TID dat dus naar ID van de klant verwijst). Zo'n constraint is het eenvoudigst aan te maken met behulp van bijvoorbeeld phpmyadmin.
Met behulp van dat constraint kun je aangeven wat er moet gebeuren als er een klant verwijderd wordt. Let er wel op dat je, als je mysql gebruikt, de InnoDB engine moet gebruiken.
Zie ook de mysql handleiding voor meer informatie over een foreign key constraint.
@allen, ik gebruik gewoon de standaard MyISAM, ik ben nog niet zo ervaren met mysql. Het is GEEN must om het in 1 query te doen. Dit leek mij gewoon makkelijk. Maar ik kan dus ook gewoon 2x een query uitvoeren?
of met ik dan met AND o.i.d gebruiken?
[edit]
Dus zoiets?
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL | E_STRICT);
$sqlklant = "DELETE * FROM hd_klanten WHERE id = '" . $_GET['id'] . "'";
$resklant = mysql_query($sqlklant) OR die mysql_error());
$sqlprobleem = "DELETE * FROM hd_geschiedenis WHERE tid = '" . $_GET['id'] . "'";
$resprobleem = mysql_query($sqlprobleem) OR die mysql_error());
if ($resklant == TRUE && $resprobleem == TRUE)
{
echo 'Klant is succesvol uit het database verwijderd.';
} else {
echo 'Het verwijderen is mislukt.';
}
?>
Eigenlijk is het WEL een must om je foreign key constraints op de juiste manier in te stellen. Dit voorkomt namelijk dat jij met een corrupte database komt te zitten. Het zou namelijk zomaar kunnen dat je met een niet helemaal netjes gescript systeem op een gegeven moment records in de problemen tabel hebt staan die verwijzen naar een klant die niet meer bestaat...
Als je toch deze constraint niet wilt gebruiken, kijk dan eens naar de DELETE syntax, daar staat ook de syntax beschreven voor het verwijderen uit meerdere tabellen.
ik gebruik gewoon de standaard MyISAM, ik ben nog niet zo ervaren met mysql
Ervaring en MyISAM hebben inderdaad een hoop met elkaar te maken en dan vooral het begrip 'slechte ervaring'. In MyISAM is het namelijk een fluitje van een cent om met 1 query jouw hele database-inhoud naar de bliksem te helpen. MyISAM doet namelijk geen enkele poging om de data te beschermen!
Gebruik dus altijd InnoDB (mocht je ondanks alle problemen met MySQL toch MySQL willen gebruiken...) om een database op te zetten. Dat je nog niet helemaal lekker met de foreignkeys kunt omgaan, geeft niks, dat komt vanzelf wel.