Snelle weet vraag: Pdo delete statement verwijderd ze allemaal?
als je opdracht geeft om een row te verwijderen op basis van een 'prepared smtn' en een id
stel er zijn toch meerdere rows gekoppeld aan diezelfde id verwijderd hij dan al die
rows ook gelijk?
Maar als je alle post verwijderd die aan user id 1337 gekoppeld zijn kunner dat duizende posts zijn.
Een prepared statement is een query waarvan de database al een plan kan opstellen zonder alle data nodig te hebben. Uiteindelijk zal deze het zelfde uitgevoerd worden als dezelfde query die wel alle data bevat. Het zal geen extra logica toevoegen.
Het is meer een id gebaseerd (als ik jou voorbeeld mag gebruiken) een toevoeging van een ander tabel
zeg maar er is een user waarvan ik al zijn posts en de betreffende user wil verwijderen.
Mijn zorgen was dat hij dan niet maar slechts 1 post verwijderd en al het andere zwevend in de database rond blijft (terwijl de user al niet meer bestaat) dus ik hoef dan geen 'loop' er om heen bouwen dat hij voor het zekere wel alle posts verwijderd? en doet hij deze loopactie dus al standaard?
Gewijzigd op 24/02/2014 11:35:12 door Francoi gckx
Klinkt alsof je een foreign key erop nodig hebt. Als je een foreign key plaatst op de post tabel die verwijst naar de user tabel (met een cascade actie op delete), dan worden alle posts automatisch verwijderd als je de user verwijdert. Hoef je dus niet handmatig user en posts te verwijderen.
Let me get this straight:
Er een tabel user:
user_id: 4
user_naam: francoi
en een tabel posts:
post_id: 1
user_id: 4
bericht: blabla
nog een post:
post_id: 2
user_id: 4
bericht: blabla2
nog een post:
post_id: 3
user_id: 4
bericht: blabla3
Dus als ik een foreign key zet op user_id (in tabel posts op user_id (waar in tabel user user_id een primary key is)), word als ik een verwijder actie zet op tabel user user_id dan zoekt hij heel de database rond voor foreign key op user_id als hij zo'n tabel heeft gevonden in dit geval tabel posts dan verwijderd hij al die ook?
Gewijzigd op 24/02/2014 11:53:07 door Francoi gckx
Code (php)
1
2
3
4
5
2
3
4
5
ALTER TABLE posts
ADD FOREIGN KEY fk_user_id(user_id)
REFERENCES users(user_id)
ON DELETE CASCADE
ON UPDATE CASCADE;
ADD FOREIGN KEY fk_user_id(user_id)
REFERENCES users(user_id)
ON DELETE CASCADE
ON UPDATE CASCADE;
Als je nu de user verwijdert, worden ook direct alle records uit de posts tabel verwijdert die linken naar de betreffende user:
Op het gebruik van foreign keys zitten wel een aantal voorwaardes. Zo moet de database engine het ondersteunen (MyISAM ondersteunt het niet, InnoDB wel) en de types van user_id uit de reference tabel en user_id uit de tabel waarop de de foreign key aanmaakt moeten exact gelijk zijn. Je kan dus niet in users de user_id kolom als INT UNSIGNED aanmaken en in de posts tabel als INT.
Je heb mij wel een klein gevoel van teleurstelling gegeven haha:P
Als ik dit eerder had geweten.. zucht.
Maar niettemin ben ik heel erg blij met een gebruiker zoals jij hier op het forum!
Ik moet alleen eerlijk toegeven dat ik toch de oude methode (voor nu!) ga gebruiken en met extra code
het ga doen aangezien dat voor mij beter bekend is maar voornamelijk het voor een grote deel zonder deze minder tijd beslagnemende manier heb gedaan:(.
In versie 2 waarin ik jou methode in ga verwerken ga ik zeker hier lol aan hebben!;):D
Toevoeging op 24/02/2014 12:54:20:
Oh toch wat vraagjes
Code (php)
1
2
3
4
5
2
3
4
5
ALTER TABLE posts
ADD FOREIGN KEY fk_user_id(user_id)
REFERENCES users(user_id)
ON DELETE CASCADE
ON UPDATE CASCADE;
ADD FOREIGN KEY fk_user_id(user_id)
REFERENCES users(user_id)
ON DELETE CASCADE
ON UPDATE CASCADE;
wat bedoel je met ADD FOREIGN KEY fk_user_id(user_id)
wat is fk_user_id? is dat de naam(verandering) van de (nieuwe) kolom (die je aanmaakt)
ze moeten toch allebei user_id heten?
Kan in tabel users de user_id slechts primary key blijven?
Kan dit via de interface van phpmyadmin gebeuren (met knoppen ipv een query) een foreign key aanmaken?
Toevoeging op 24/02/2014 12:59:28:
Zijn er gevallen waarin je de foreign key goed heb toegepast en de code
maar toch op een bepaalde post (van de duizende) een update het laat afweten (door een storing ofzo)?
Gewijzigd op 24/02/2014 13:02:11 door Francoi gckx
Je kunt via phpmyadmin foreign keys aanmaken.
Zolang er geen foreign keys zijn die niet ON DELETE CASCADE of ON DELETE DEFAULT ingesteld staan hoort alles wat je laat cascaden ook echt verwijderd te worden.
Als je huidige plan is om in PHP een loop te maken om dingen te verwijderen stel ik voor dat je hier een kijkje gaat nemen: http://stackoverflow.com/questions/17083862/mysql-delete-row-where-parent-does-not-exist
Schrijf een query per tabel met een left join en verwijder alles waar de rechter tabel alleen NULL waardes bevat (op velden die niet NULL kunnen zijn)
het word eigelijk een eigenschap van user_id in de post tabel.
Mij tijdelijk huidige plan is dit.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public function delete_user($id_numm)
{
$query = $this->db->prepare("DELETE FROM users WHERE user_id = ?");
$query->bindValue(1, $id_numm);
try
{
$query->execute();
$query1 = $this->db->prepare("DELETE FROM posts WHERE user_id = ?");
$query1->bindValue(1, $id_numm);
try
{
$query1->execute();
}
catch (PDOException $e)
{
die($e->getMessage());
}
resterende deel weglatend..
{
$query = $this->db->prepare("DELETE FROM users WHERE user_id = ?");
$query->bindValue(1, $id_numm);
try
{
$query->execute();
$query1 = $this->db->prepare("DELETE FROM posts WHERE user_id = ?");
$query1->bindValue(1, $id_numm);
try
{
$query1->execute();
}
catch (PDOException $e)
{
die($e->getMessage());
}
resterende deel weglatend..
Toevoeging op 24/02/2014 13:46:16:
Kan er mee door toch?