You may want to put some text here

Deleten met Left join in MySQL

Het verwijderen van rijen in MySQL met een relatie kan soms een lastige taak zijn. Om deze taak gemakkelijker te maken kan je delete queries gaan uitvoeren met een left join. Hoe je dit doet zal ik in het volgende voorbeeld laten zien.

Database structuur

Als eerste tabel heb je “gebruiker” met als kolommen ID, gebruiker_voornaam en gebruiker_achternaam. De tweede tabel die je nodig hebt in dit voorbeeld is “project” met als kolommen ID, gebruiker_ID en project_naam.

Als je het voorbeeld wilt volgen op je eigen MySQL server kan je de volgende queries gebruiken om de tabellen aan te maken.

CREATE TABLE `gebruiker` (
`ID` int(11) NOT NULL auto_increment,
`gebruiker_voornaam` varchar(20) NOT NULL,
`gebruiker_achternaam` varchar(30) NOT NULL,
PRIMARY KEY  (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

INSERT INTO `gebruiker` (`ID`, `gebruiker_voornaam`, `gebruiker_achternaam`) VALUES
(1, 'Jef', 'Vermassen'),
(2, 'Wim', 'Jansen');

CREATE TABLE `project` (
`ID` int(11) NOT NULL auto_increment,
`gebruiker_ID` int(11) NOT NULL,
`project_naam` varchar(30) NOT NULL,
PRIMARY KEY  (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

INSERT INTO `project` (`ID`, `gebruiker_ID`, `project_naam`) VALUES
(1, 1, 'Website debuggen'),
(2, 1, 'PHP leren'),
(3, 2, 'Computer herstellen');

In deze database kan je gebruikers toevoegen en aan deze gebruikers kan je dan projecten hangen. Het is maar een voorbeeld database dus ik heb het zeer simpel gehouden.

Left join delete

Stel nu dat je een gebuiker uit de database wilt verwijderen samen met al zijn projecten.
Dit kan je doen met één enkele query die er als volgt uit ziet

DELETE g.*, p.*
FROM `gebruiker` g
LEFT JOIN `project` p ON g.ID = p.gebruiker_ID
WHERE g.ID = '1'

Op het eerste zicht is er niet iets heel bijzonders aan deze query maar niets is minder waar. Achter onze delete moet je expliciet zeggen welke kolommen je wilt verwijderen. Als je dit niet doet zal de query mislukken. Zou je dus in plaats van g.*, p.* een * gebruiken om je kolommen te selecteren krijgen je een error als deze:

#1064 - You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near '*
FROM `gebruiker` g
LEFT JOIN `project` p ON g.ID = p.gebruiker_ID
WHERE g.' at line 1

Belangrijk om te onthouden is dus dat je altijd expliciet de kolommen moet opgeven bij een join delete.

The Author of this post is Wim Mostmans

Wim Mostmans heeft een eigen webontwikkeling bedrijf Sitebase waar hij voltijds voor werkt. Hij beheert ook nog enkele websites waaronder deze en een Computerforum. Blijf op de hoogte van waar Wim mee bezig is door hem te volgen op Twitter.

1 Responses »

  1. Bij mij werkte dit niet, maar zoiets simpels als:

    DELETE `gebruiker`, `project`
    FROM `gebruiker`
    LEFT JOIN `project` ON gebruiker.ID = project.gebruiker_ID
    WHERE gebruiker.ID = ‘1’

    werkte wel!
    MySQL versie afhankelijk?
    In ieder geval een leuk resultaat met de daadwerkelijke dB:
    “10690 rijen verwijderd. ( query duurde 5.0155 sec )”

Leave a Comment