Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[MySQL] Deleten gegevens twee tabellen werkt niet

Pagina: 1
Acties:

  • oli4100
  • Registratie: November 2002
  • Niet online
Beste allen,

Ik heb het volgende probleem. Ik heb een database met daarin personen staan. Deze personen kunnen ook specifieke eigenschappen hebben, naargelang het type persoon. Dat betekent dus dat iedereen in de persoontabel staat, maar niet iedereen in de "lid"-tabel (bijvoorbeeld). Nu wil ik een verwijder functie maken, die ervoor zorgt dat zowel de informatie uit de persoon-tabel als uit de specifieke tabel gewist wordt. In dit geval is het vooral belangrijk dat het in eerste instantie werkt met de "lid"-tabel. De volgende mogelijkheden heb ik al geprobeerd:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    case "delete":

//Poging 1:
            $id = $_GET['id'];
            mysql_query("DELETE FROM b_lid WHERE id_persoon='$id'") or die (mysql_error()); 
            mysql_query("DELETE FROM b_persoon WHERE id='$id'") or die (mysql_error());

//Poging 2:
            $sql = 'DELETE FROM b_lid WHERE id_persoon='.$_GET['id'];
            mysql_query($sql);
            $sql2 = 'DELETE FROM b_persoon WHERE id='.$_GET['id'];
            mysql_query($sql2);

//Poging 3:
            mysql_query("DELETE b_lid, b_persoon FROM b_lid, b_persoon WHERE b_lid.id_persoon=b_persoon.$id");

//Poging 4:
            mysql_query("DELETE FROM b_persoon, b_lid WHERE b_persoon.id = b_lid.persoon_id AND b_persoon.id");

//Poging 5 (dit werkt al helemaal niet, is ook een rare oplossing, maar wilde zoiets proberen):
            $lid = mysql_fetch_array($query, MYSQL_NUM);
            $sql = 'DELETE FROM b_lid WHERE id_persoon='.$lid[0];
            mysql_query($sql) or die (mysql_error());
            $sql2 = 'DELETE FROM b_persoon WHERE id='.$lid[0];
            mysql_query($sql) or die (mysql_error());

//Poging 6 (werkt wel maar ja, dat is met een vast ID):
            $sql = 'DELETE FROM b_lid WHERE id_persoon=4454';
            mysql_query($sql) or die (mysql_error());

//Poging 7: werkt ook niet
            mysql_query("DELETE id FROM b_lid WHERE id_persoon=".$lid[0]." LIMIT 1");
            exit();


Het vreemde is, zelfs als ik een vast ID neem werkt het verwijderen uit de persoon-tabel niet. Wel uit de lid-tabel. Ik zie ook door de bomen het bos niet meer dus zie syntax fouten af en toe ook niet meer. Verder is mijn php/sql-kennis zeer beperkt, maar zelfs met nazoeken op internet kom ik er echt niet uit. Sommige dingen zouden echt moeten werken, en dan krijg ik ook geen foutmelding, maar dan wordt er tóch niets verwijderd.

Mijn vraag: Hoe moet ik dit schrijven zodat het werkt?

/edit:

Het gaat er dus om dat de persoontabel een ID heeft, en dat de lid-tabel een ID_persoon heeft. Deze nummers corresponderen met elkaar en daardoor worden de gegevens aan elkaar gekoppeld. Maar als je dus een lid verwijderd, moet deze zowel uit de persoon tabel als uit de lid tabel verwijderd worden.

[ Voor 6% gewijzigd door oli4100 op 22-10-2007 17:29 ]


  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
//Poging 6 (werkt wel maar ja, dat is met een vast ID):
$sql = 'DELETE FROM b_lid WHERE id_persoon=4454';
Dit betekent dat je de juiste SQL syntax al hebt ontdekt (nl. bovenstaande), en dat de constructie met een variabele id fout gaat vanwege de manier die je gebruikt om een ID aan je SQL query string te plakken.

Tip: gebruik echo om eens na te gaan wat er nu echt in $sql komt te staan bij een statement als "$sql = 'DELETE FROM b_lid WHERE id_persoon='.$_GET['id'];"
Het gaat er dus om dat de persoontabel een ID heeft, en dat de lid-tabel een ID_persoon heeft. Deze nummers corresponderen met elkaar en daardoor worden de gegevens aan elkaar gekoppeld. Maar als je dus een lid verwijderd, moet deze zowel uit de persoon tabel als uit de lid tabel verwijderd worden.
Maak je die relatie ook expliciet door een foreign key tussen deze velden? Zo niet: wel doen ;)

Meer specifiek, voor het veld 'id' van de tabel b_persoon moet een primary key gedefinieerd zijn, en het veld 'id_persoon' van de tabel b_lid moet een foreign key krijgen die verwijst naar het veld 'id' van tabel b_persoon. Zo kan je MySQL laten afdwingen dat id_persoon alleen geldige waardes bevat (m.a.w.: waarden waarvoor in b_persoon ook echt een persoon bestaat).

Vervolgens kun je, door op de foreign key definitie aan te geven dat het 'cascading deletes' moet toepassen, afdwingen dat, wanneer een persoon verwijderd wordt, alle rijen uit b_lid die naar die betreffende persoon verwijzen, automatisch meeverwijderd worden (let wel: precies andersom als dat jij aangaf).

Overigens, vroeger bestond deze functionaliteit alleen bij het InnoDB tabeltype... ik weet niet welk tabeltype jij nu gebruikt (MyISAM?)

[ Voor 29% gewijzigd door MrBucket op 22-10-2007 17:44 ]