Verrukking

2 november 2007 at 10:51 pm 1 reactie

Soms kan ik echt geestelijk bevredigd zijn. Zoals gisteren (en ook nog een beetje vandaag).

Ik was aan het werken aan een (eenvoudige) database bestaande uit twee tabellen die aan elkaar gerelateerd zijn. Een voorbeeld ter verduidelijking. Neem een database met persoonsgegevens bestaat uit twee tabellen; een tabel
Personen:

|--|----|--------|-----------|
|id|naam|voornaam|gemeente_id|
|--|----|--------|-----------|

en een tabel Gemeenten:

|--|--------|--------|
|id|postcode|gemeente|
|--|--------|--------|


In het veld Personen.gemeente_id moet de waarde uit het overeenkomstige veld Gemeenten.id komen. Om dus gegevens in de tabel Personen in te voeren heb je de naam, voornaam en gemeente_id nodig. Je zou twee queries kunnen gebruiken (de eerste om de id uit tabel Gemeenten op te vragen, overeenkomend met een vooraf opgegeven postcode of gemeentenaam; de tweede om de bekomen id samen met de naam en voornaam in te voeren in de tabel Personen).

1)

SELECT id FROM Gemeenten WHERE postcode = 9000;

(–> het resultaat steek je in een variabele, $gemeente_id)
2)

INSERT INTO Personen (naam, voornaam, gemeente_id) VALUES ('Pietsnot', 'Jan', $gemeente_id);

Dit is voor de hand liggend en werkt zonder problemen, maar er is ook nog een andere mogelijkheid, nl. “INSERT … SELECT …” gebruiken:

INSERT INTO Personen (naam, voornaam, gemeente_id) SELECT 'Pietsnot', 'Jan', id FROM Gemeenten WHERE postcode = 9000;

Deze query wordt in MySQL uitgevoerd zonder warnings, dus ’t zal wel goed zijn zeker? Eén esthetisch minpuntje echter, en dat is het feit dat je letterlijke waarden selecteert uit een database die die waarden niet bevat:

SELECT 'Pietsnot', 'Jan' FROM Gemeenten;

Er zijn in de tabel Gemeenten helemaal geen kolommen met de naam Pietsnot of Jan, noch bevat deze tabel deze waarden in een van zijn kolommen. Toch is deze query toegestaan, om dat je met SELECT ook letterlijke waarden kunt opvragen (normaal gezien doe je dit niet, want waarom zou je ze opvragen als je ze al kent?). In dit geval komt dit dus goed van pas.

Let wel op: als je geen WHERE clause gebruikt, dan krijg je als resultaat een lijst van x aantal keer de letterlijke waarde (waarbij x het aantal rijen in de tabel is).

Een ander voorbeeld is:

SELECT 2*3;

Dit geeft 7 als resultaat, nietwaar? Niet waar! ’t Is 6!

Tot zover de amuse-geule. Het beste moest nog komen. Niet alleen moeten er gegevens ingevoerd worden, ze moeten ook nog eens gewijzigd kunnen worden. Hier bestaat hetzelfde probleem: je moet de id van de gemeente kennen die hoort bij een bepaalde postcode.

In het eenvoudige geval vraag je dus eerst weer de id op (zie query 1) en dan gebruik je dit resultaat in een UPDATE query. Stel dat Jan Pietsnot in een witness protection programme zit en dus moet verhuizen en zijn naam veranderen:

UPDATE Personen SET naam='PietJoris', gemeente_id = $gemeente_id;

Ook hier kun je alles ineens doen met een schitterende truc:

UPDATE Personen, (SELECT id FROM Gemeenten WHERE postcode = 8000) AS tmp SET naam='PietJoris', gemeente_id = tmp.id WHERE Personen.id = [het volgnummer van de persoon in tabel Personen];

Binnen de UPDATE clause som je normaal gezien de tabellen op die je wil wijzigen. De truc bestaat erin de id van de Gemeente te selecteren en dit resultaat te benoemen als een (tijdelijke) tabel (tmp). De verwijzing ‘tmp’ gebruik je verder om het resultaat op te vragen (tmp.id).

Fantastisch vind ik dit! (maar ‘k heb het wel niet zelf gevonden)

Advertenties

Entry filed under: computer.

3,5 jaar geleden Forelstraat III

1 reactie Add your own

  • 1. Nathalie  |  2 november 2007 om 11:24 pm

    nu nog uw lief laten genieten van een lichamelijke bevrediging!!!

Geef een reactie

Vul je gegevens in of klik op een icoon om in te loggen.

WordPress.com logo

Je reageert onder je WordPress.com account. Log uit / Bijwerken )

Twitter-afbeelding

Je reageert onder je Twitter account. Log uit / Bijwerken )

Facebook foto

Je reageert onder je Facebook account. Log uit / Bijwerken )

Google+ photo

Je reageert onder je Google+ account. Log uit / Bijwerken )

Verbinden met %s

Trackback this post  |  Subscribe to the comments via RSS Feed


Meest recente berichten

I'm del.icio.us

RSS

syndication Feed me
No Atom feed...

%d bloggers liken dit: