Uit de bovenstaande tabellen (eerste tabel heet ''LID'' en tweede ''BESTUURSLID'') is het de bedoeling dat ik een lijst van alle leden met indien mogelijk informatie over de bestuursfunctie die het lid heeft gehad moet maken. Hierbij moet ik alléén het lidnummer, de naam, de functie en de begindatum tonen.
Mijn 2e vraag heeft te maken met de volgende tabel: [img]http://www.plaatjesupload.nl/bekijk/2011/01/30/1296407589-522.jpg[/img]
In de tabel BesteldArtikel moet ik een betekenisloze primaire sleutel genaamd banr gebruiken. Ik moet een SQL script maken dat deze wijziging doorvoert. Ik moet daarvoor natuurlijk Alter en Drop statements gebruiken, maar ik weet echt niet hoe ik deze kan gebruiken??
De uniciteitsregel voor de kolommen bestelnr, artikelcode moet blijven bestaan.
Hoe kan ik deze scripten het beste maken? Als iemand mij een beetje op weg kan helpen, ben ik hem/haar zeer dankbaar! :)
1. Is spelersnr hetzelfde als lidnr ?
Met een join van beide tabellen haal je eenvoudig de informatie op die je nodig hebt.
2. Waarom drop statements? Je kan toch gewoon een (unieke) sleutel toevoegen aan de tabel?
De eerste is niet zo moeilijk, zoals John aan gaf, een join is waarschijnlijk de "beste" manier om dit op te lossen. Ik zelf hou alleen niet van die lastige queries, maar wat je zou kunnen doen is:
SELECT * FROM lid
SELECT * FROM bestuurslid
Wanneer je gaat verwerken in je loopjes, kun je controleren of het huidige ID overeenkomt met een ID binnen de resultaten van bestuurdlid, zoja, dan weet je natuurlijk dat je een match gevonden hebt en kun je dit weergeven.
De 2e is iets anders denk ik. Je maakt een "nutteloze" tabel aan? Of nee, sorry, een nutteloos veld? Als je weet wat de banr sequence is, kun je in postgresql een stored function gebruiken. ALTER en DROP statements zijn daar echt niet voor nodig. Als je iets wil wijzigen kun je nog altijd UPDATE en DELETE gebruiken.
De eerste is niet zo moeilijk, zoals John aan gaf, een join is waarschijnlijk de "beste" manier om dit op te lossen. Ik zelf hou alleen niet van die lastige queries, maar wat je zou kunnen doen is:
SELECT * FROM lid
SELECT * FROM bestuurslid
Wanneer je gaat verwerken in je loopjes, kun je controleren of het huidige ID overeenkomt met een ID binnen de resultaten van bestuurdlid, zoja, dan weet je natuurlijk dat je een match gevonden hebt en kun je dit weergeven.
Met alle respect, dit is geen goeie oplossing. ALLE data naar memory processen richting php (http deamon) en dan deze belasten met werk waarvoor het niet gemaakt is. Een join is zeer snel opgelost door MySQL omdat deze engine ervoor gemaakt is. Een workaround via php omdat je die taal beter spreekt wordt veel toegepast maar is fout!
1. spelersnr = lidnr inderdaad.
2. drop en alter moet gebruikt worden, volgens docent.
opdracht van de join heb ik de volgende query voor gemaakt:
SELECT lidnr, achternaam, spelersnr, functie, begin_datum
FROM lid, bestuurslid
WHERE lidnr = spelersnr;
selecteer slechts wat je nodig hebt:
SELECT lidnr, achternaam, functie, begin_datum
FROM lid, bestuurslid
WHERE lidnr = spelersnr;
Voor de andere vraag moet je dus aan de tabel een betekenisloos id toevoegen?
1. Creeer een nieuwe tabel met als primaire sleutel dat id of banr met autoincrement (whats in a name), plus daarbij de andere velden.
2. Zet de data over: insert into nieuwe_tabel select from oude tabel
3. drop oude tabel
4. rename nieuwe tabel naar oude tabel
Voor de andere vraag moet je dus aan de tabel een betekenisloos id toevoegen?
1. Creeer een nieuwe tabel met als primaire sleutel dat id of banr met autoincrement (whats in a name), plus daarbij de andere velden.
2. Zet de data over: insert into nieuwe_tabel select from oude tabel
3. drop oude tabel
4. rename nieuwe tabel naar oude tabel
Hartstikke fijn! Bedankt voor je hulp ik probeer de tweede opdracht te maken en post het hier zodat je kan kijken of ik het goed heb gedaan.
even snel uit het hoofd en wees niet te snel met het DROP statement. Dit is overigens MySQL en misschien moet je nog wat omsleutelen naar Postgres??
rename table BESTELDARTIKEL to BESTELDARTIKEL_old;
CREATE TABLE BESTELDARTIKEL (
banr int(11) NOT NULL auto_increment,
bestelnr int(11) NOT NULL,
artikelcode int(11) NOT NULL,
aantal int(11) NOT NULL,
PRIMARY KEY (id),
KEY bestelnr_ix (bestelnr),
artikelcode_ix (artikelcode),
aantal_ix (aantal);
insert into BESTELDARTIKEL
(
bestelnr
artikelcode
aantal
) values (
select
bestelnr
artikelcode
aantal
from BESTELDARTIKEL_old);
drop table BESTELDARTIKEL_old;
en probeer er wat van te leren want phphulp is er niet om je schoolopdrachten te doen....
Dit is heel mooi! Ik wil je echt bedanken, en hoop dat ik hier ook van leer. Waar kan ik ALTER TABLE BesteldArtikel ADD (banr number(10)); gebruiken? ALTER moet er dus ook instaan.
ALTER TABLE BesteldArtikel ADD (banr number(10)); ??
Geen idee, kennelijk heeft je docent of je lesboek een andere manier voor ogen.
Ik zie dat je number(10) moet gebruiken voor getallen, verander dus in mijn voorbeeld int(11) allemaal maar even naar number(10). Verder weet ik niet of het KEY statement in Postgres compatibel is.[edit]Dit is wellicht wat meer postgres:[/edit]
CREATE TABLE BESTELDARTIKEL (
banr number(10) NOT NULL,
bestelnr number(10) NOT NULL,
artikelcode number(10) NOT NULL,
aantal number(10) NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY ( bestelnr) REFERENCES bestelling ( bestelnr),
( artikelcode) REFERENCES artikel ( artikelcode);