login  Naam:   Wachtwoord: 
Registreer je!
 Tutorials

Tutorials > MySQL


Gegevens:
Geschreven door:
Thomas
Moeilijkheidsgraad:
Normaal
Hits:
60942
Punten:
Aantal punten:
 (4.88)
Aantal stemmen:
16
Stem:
Niet ingelogd
Nota's:
 Lees de nota's (3)
 


Tutorial:

CREATE TABLE

CREATE TABLE
Met dit statement kun je tabellen in mysql aanmaken. Tabellen worden gebruikt om gestructureerd een bepaald soort gegevens op te slaan bijv. een adressenbestand, een verjaardagskalender et cetera.
Dit statement ziet er (abstract) als volgt uit:

CREATE TABLE <TABEL_NAAM> (
  <KOLOM_NAAM> [TYPE] {NULL, NOT NULL} {DEFAULT <STANDAARD_WAARDE>} {AUTO_INCREMENT}+
  [KOLOM_EIGENSCHAPPEN]+
) [OPTIES];


Betekenis van de verschillende symbolen (gelden overal binnen deze tutorial, tenzij anders vermeld):

< > = zelf te kiezen naam
[ ] = van een voorgeschreven vorm
{ } = optioneel (mag weggelaten worden)
( ) = openings- en sluitingshaken
 +  = 1 of meer van dit soort regels, elke regel gescheiden door een komma

(aan het einde van de tutorial zal een uitgebreid voorbeeld gegeven worden waarin deze abstracte vorm stap voor stap omgeschreven wordt tot een toegestane CREATE TABLE-query).

CREATE TABLE <TABEL_NAAM>
De naam van de tabel- <TABEL_NAAM> -is vrij te kiezen, mits je niet al te rare karakters of spaties en dergelijke gebruikt. Het is handig om een korte en beschrijvende naam te geven aan je tabel, zodat je aan de titel kunt zien wat voor gegevens er in de tabel staan.

<KOLOM_NAAM> [TYPE] {NULL | NOT NULL} {DEFAULT <STANDAARD_WAARDE>} {AUTO_INCREMENT}+
De regel met het + karakter kan meerdere keren voorkomen in je CREATE TABLE statement, meestal is het namelijk zo dat je tabel uit meerdere velden (kolommen) bestaat.
Wederom is het kiezen van beschrijvende namen voor je kolom(men) -in te vullen in <KOLOM_NAAM>- aan te raden.

Elke kolom is van een voorgeschreven TYPE: [TYPE]. Typen zijn grofweg in drie groepen te verdelen: nummertypen, datum- en tijdtypen en teksttypen. Bij sommige typen kun je aangeven uit hoeveel karakters het veld bestaat, (dit hoeft trouwens niet per sé maar als je weet hoeveel karakters een veld kan hebben is het beter -in verband met geheugenopslag enzo- om precies aan te geven hoe groot een veld (maximaal) kan zijn). We zullen kort ingaan op de meest voorkomende typen.

Mogelijke invoer voor [TYPE]:
TINYINT{(1-255)} {UNSIGNED} {ZEROFILL}
Dit type gebruik je als je een klein geheel getal wilt opslaan, wat binnen het waardenbereik -128 tot en met 127 ligt. Bij alle nummer-typen bestaat er de mogelijkheid om er het optionele veld "UNSIGNED" achter te zetten. Wanneer je dit veld gebruikt heb je ALLEEN de beschikking over positieve getallen, maar je bereik (naar boven toe) is dan ook 'groter' (0 t/m 255). Als je een veld aanmaakt met

getal1 TINYINT

mag je in het veld 'getal1' dus getallen stoppen die lopen van -128 tot en met 127. Als je een veld aanmaakt met

getal2 TINYINT UNSIGNED

mag je in het veld 'getal2' getallen stoppen die lopen van 0 tot en met 255.

Wanneer je het optionele veld {ZEROFILL} gebruikt bij het aanmaken van een tabel(veld), wordt UNSIGNED ook (impliciet) 'geactiveerd', dus gebruik geen ZEROFILL tenzij je met getallen wilt werken die enkel groter dan of gelijk aan 0 zijn.

NB: Omdat het waardenbereik van TINYINTs nooit groter wordt dan 255 (of kleiner dan -127), zal elk getal uit maximaal 3 cijfers bestaan. Het reserveren van meer dan 3 plaatsen voor een TINYINT (bijv. getal3 TINYINT(5) UNSIGNED) is dus niet zinnig.

NB 2: het kolomtype BOOL is synomiem voor TINYINT(1), waarbij de waarde 0 gelijk is aan false, en een waarde ongelijk aan 0 true.

Op dezelfde wijze heb je de ook de beschikking over de volgende nummertypen:

SMALLINT{(1-255)} {UNSIGNED} {ZEROFILL}
Waardenbereik
signed: -32768 t/m 32767
unsigned: 0 t/m 65535

MEDIUMINT{(1-255)} {UNSIGNED} {ZEROFILL}
Waardenbereik
signed: -8388608 t/m 8388607
unsigned: 0 t/m 4294967295

INT{(1-255)} {UNSIGNED} {ZEROFILL} of INTEGER{(1-255)} {UNSIGNED} {ZEROFILL}
Waardenbereik
signed: -2147483648 t/m 2147483647
unsigned: 0 t/m 4294967295

Meestal gebruik je voor het opslaan van getallen deze variant (INT), waarbij je aangeeft uit hoeveel cijfers de gebruikte getallen bestaan.

BIGINT{(1-255)} {UNSIGNED} {ZEROFILL}
Waardenbereik
signed: -9223372036854775808 t/m 9223372036854775807
unsigned: 0 t/m 18446744073709551615

Voor breuken en dergelijke gebruik je een van de volgende typen (hier zal verder niet op in gegaan worden):

FLOAT{(1-255, 1-30)} {UNSIGNED} {ZEROFILL}
Een single-precision floating point nummer.

REAL{(1-255, 1-30)} {UNSIGNED} {ZEROFILL} of DOUBLE{(1-255, 1-30)} {UNSIGNED} {ZEROFILL}
Een double-precision floating point nummer.

DECIMAL{(1-255 {, 1-30})} {UNSIGNED} {ZEROFILL} of NUMERIC{(1-255 {, 1-30})} {UNSIGNED} {ZEROFILL}
Een unpacked floating point nummer (dit getal is opgeslagen als een string).

CHAR of CHAR(1)
Kan één karakter vasthouden.

VARCHAR{(0-255)} {BINARY}
Dit type wordt meestal gebruikt voor het opslaan van (korte) teksten (met een maximale lengte van 255 karakters). Normaal is het zo dat wanneer inhoud van zo'n kolom gesorteerd of vergeleken wordt met een andere string, dit op case-insensitive wijze gebeurt (er wordt geen onderscheid gemaakt tussen kleine letters en hoofdletters). Wanneer je het optionele veld "BINARY" toevoegt, zal er wèl case-sensitive worden gesorteerd en vergeleken.

DATE
Een datum van de vorm JJJJ-MM-DD, met een bereik van 1000-01-01 t/m 9999-12-31. Je kan een datum wegschrijven naar een veld van dit type met behulp van een string of een nummer. Wanneer je datums op wilt slaan in je database, kun je ook een veld van het type INT gebruiken (je gebruikt dan UNIX-tijden), of gewoon een string (VARCHAR) van een geschikte lengte (zie de PHP functie date() of time()).

TIME
Een tijd van de vorm uu:mm:ss, met een bereik van -838:59:59 t/m 838:59:59. Ook hier is weer de mogelijkheid een veld van dit type in te vullen met behulp van een string of een integer. Wanneer je tijden op wilt slaan in je database, kun je ook een veld van het type INT gebruiken, of gewoon een string (VARCHAR) van een geschikte lengte (zie de PHP functie date() of time()).

TIMESTAMP {(6,8,12,14)}
Een datum-tijd combinatie, van de vorm jjmmdd, jjjjmmdd, jjmmdduummss, jjjjmmdduummss - afhankelijk van de lengte die je invult bij het aanmaken, met een bereik van 1970-01-01 00:00:00 tot "ergens in het jaar 2037".

DATETIME
Een datum-tijd combinatie van de vorm jjjj-mm-dd uu:mm:ss, met een bereik van 1000-01-01 00:00:00 t/m 9999-12-31 23:59:59. Ook hier bestaat er weer de mogelijkheid om kolommen van dit type te vullen met behulp van een string of een integer.

TINYBLOB of TINYTEXT
Een BLOB of TEXT is een type dat maximaal 255 karakters kan vasthouden. Het verschil tussen een BLOB en TEXT (algemeen) is dat het sorteren en vergelijken van de inhoud van zo een BLOB case sensitive gebeurt, en bij een TEXT is dit case-insensitive - oftewel een TEXT is een case-insensitive BLOB. Een TEXT zou je ook kunnen zien als een VARCHAR met 'onbeperkte' grootte. TINYBLOB is dus ook vergelijkbaar met VARCHAR(255) BINARY (zie het type VARCHAR).

BLOB of TEXT
Case sensitive / insensitive (respectievelijk) type dat text kan vasthouden met een maximale lengte van 65535 karakters. Het type TEXT gebruik je meestal wanneer je lange beschrijvingen of nieuwsitems wilt opslaan.

MEDIUMBLOB of MEDIUMTEXT
Case sensitive / insensitive (respectievelijk) type dat text kan vasthouden met een maximale lengte van 16777215 karakters.

LONGBLOB of LONGTEXT
Case sensitive / insensitive (respectievelijk) type dat text kan vasthouden met een maximale lengte van 4294967295 karakters.

ENUM('waarde1', 'waarde2', ..., NULL)
Wanneer je wilt dat er maar één waarde uit een beperkt aantal voorgeschreven waarden opgeslagen mag worden in een kolom, gebruik je dit type. Alle toegestane waarden (of geen waarde - NULL) dien je dan bij aanmaak van een tabel(kolom) op te geven. Stel je wilt de huwelijksstatus van iemand bijhouden. Je kan dan bij het aanmaken van de tabel
het volgende doen:

huwelijksstatus ENUM("gehuwd", "ongehuwd")

Vervolgens kun je bij het invoeren van gegevens in zo'n kolom kiezen voor "gehuwd" of "ongehuwd". Het ENUM type kan maximaal 65535 verschillende waarden bijhouden.

SET('waarde1', 'waarde2', ...)
Een verzameling met een aantal verschillende waarden. Dit veld zal 0 of meer verschillende waarden uit deze SET als (string)invoer accepteren (dus alle deelverzamelingen van de SET worden geaccepteerd).
Stel je wilt bijhouden welke dagen van de week iemand bereikbaar is. Je zou dan dus het volgende veld (kolom) aan kunnen maken:

beschikbaar SET("ma", "di", "wo", "do", "vr", "za", "zo")

Geldige invoer is dan dus bijv.:
""
of
"ma"
of
"za, zo"
(invoer van meerdere waarden wordt gescheiden door een komma)

Een SET kan maximaal 64 verschillende waarden bevatten.

Hierboven zijn vele varianten voor [TYPE] genoemd. De typen die je het meeste zult gebruiken zullen waarschijnlijk beperkt zijn tot INT, VARCHAR, TEXT (, BLOB, ENUM en SET) tenzij je hele specifieke dingen in je database wilt stoppen (en een performance freak bent).

{NULL, NOT NULL}, {DEFAULT <STANDAARD_WAARDE>} en {AUTO_INCREMENT}
Het laatste deel van de <KOLOM_NAAM> regel bestaat uit een aantal optionele velden.

Allereerst NULL, NOT NULL. Hiermee geef je aan of een veld ingevuld moet zijn als je een regel aan een tabel toevoegt. Wanneer je geen NULL of NOT NULL invult zal dit hetzelfde effect hebben als wanneer je NULL invult.

Met DEFAULT <STANDAARD_WAARDE> geef je aan wat er ingevuld wordt op deze kolomplaats wanneer je een regel aan de tabel toevoegt die geen waarde heeft voor deze kolom. Let er op dat deze standaard waarde aan moet sluiten bij het TYPE wat je gebruikt voor deze kolom.
Maak je bijvoorbeeld het veld 'naam' als volgt aan:

naam VARCHAR(100) DEFAULT "A. noniem"

Wanneer het veld 'naam' open gelaten wordt bij het toevoegen van een regel aan deze tabel, zal er automatisch in dit veld de waarde "A. noniem" ingevuld worden.

Tot slot AUTO_INCREMENT. Dit optionele veld mag worden toegevoegd aan een veld van het INT(EGER) type. Wanneer je een NULL waarde of een 0 toevoegt (of helemaal geen waarde aan deze kolom toekent) aan een kolom met de AUTO_INCREMENT eigenschap, zal er een waarde in dit veld worden ingevoerd dat gelijk is aan de grootste waarde die in deze kolom bestaat PLUS 1. Een veld met de AUTO_INCREMENT eigenschap wordt dus vaak gebruikt wanneer je tabelrijen (automatisch en oplopend) wilt nummeren.

[KOLOM_EIGENSCHAPPEN]+
In dit onderdeel kun je aangeven dat bepaalde velden (die je eerder in de CREATE TABLE query hebt omschreven) speciale eigenschappen hebben. We zullen hier alleen de kolomeigenschappen PRIMARY KEY, UNIQUE en FULLTEXT bekijken.

Met de uitdrukking PRIMARY KEY geven we aan dat de waarde in deze kolom maar één keer voorkomt in alle rijen van de tabel. Een PRIMARY KEY wordt ook wel het "identificerende" veld van een tabel genoemd. Met de waarde van dit veld onderscheidt deze tabelrij zich van de andere rijen - het maakt deze rij UNIEK. Kolommen van dit type moeten altijd ingevuld worden (en zijn dus automatisch "NOT NULL"). Het is verstandig om in elke tabel een primaire sleutel aan te maken. Deze kolomeigenschap ziet er volledig als volgt uit:

userid INT(10), <-- eerst dient het veld aangemaakt te worden
...
PRIMARY KEY(userid) <- vervolgens geven we aan dat dit veld de primaire sleutel is

Met de uitdrukking UNIQUE geven we aan dat een kolomwaarde maar één keer in de hele tabel mag voorkomen. Het enige verschil met PRIMARY KEY is dat velden met de UNIQUE eigenschap (meerdere keren ?) de waarde NULL (leeg) mogen hebben. Al wordt dit mij niet helemaal duidelijk uit de notities op www.mysql.com. Het toekennen van de eigenschap UNIQUE aan een tabelveld gebeurt op dezelfde wijze als bij PRIMARY KEY (eerst het veld aanmaken, en vervolgens aangeven dat het UNIQUE dient te zijn).

FULLTEXT
Bij velden van het type VARCHAR en TEXT kun je een zogenaamde index aanmaken van het type FULLTEXT. Dit stelt je in staat om full-text searches uit te voeren. Dit houdt in dat je zeer uitgebreid kan zoeken in teksten. Deze index kun je het beste aanmaken als je deze extra zoekfunctionaliteit ook echt gaat gebruiken (wanneer LIKE tekort dreigt te schieten), want het maakt je database-tabel wat logger.

Zie voor meer informatie http://dev.mysql.com/doc/mysql/en/Fulltext_Search.html

[OPTIES]
Bij opties kun je ook nog een aantal tabel-gerelateerde zaken instellen, we bekijken hier echter alleen de optie TYPE=[TABEL_TYPE]. Het beste is om het meest gangbare tabeltype te kiezen, en dat is MyISAM. MyISAM ondersteunt NULL (lege) waarden in tabelvelden, wat wel eens handig kan zijn. Dus zet aan het einde van elk CREATE TABLE statement het volgende:

TYPE=MyISAM

Tot slot geven we nog een kort voorbeeld:
Vooraf moet gezegd worden dat je je een hoop ellende kunt besparen door EERST goed na te denken over wat je allemaal in een tabel wilt zetten (en hoe), en dat je DAARNA de tabel aanmaakt. Tabellen worden namelijk meestal voor langere duur gebruikt. Veranderingen aanbrengen in bestaande tabellen kan de gegevens die al in deze tabellen staan aantasten of in het ergste geval zelfs onbruikbaar maken.

In het voorbeeld maken we een tabel aan die gegevens van mensen bijhoudt, zoals (voor)naam, tussenvoegsel, achternaam, geboortedatum, geslacht, telefoonnummer, email, notities. Eerst gaan we nadenken over de naam van de tabel. "persoon" is wel een redelijk omschrijvende titel (afkorten mag, zolang maar duidelijk blijft wat er wordt bedoeld). Vervolgens kijken we naar de verschillende tabelnamen.
We nemen hiervoor "voornaam", "tussenv", "achternaam", "gebdat", "geslacht", "telnr", "email" en "notities". Omdat meerdere mensen dezelfde naam kunnen hebben, voegen we ook nog een identificatieveld toe: "pid". Daarna maken we een keuze uit de verschillende kolomtypen en de groottes hiervan.
De abstracte MySQL query uit het begin van de tutorial

CREATE TABLE <TABEL_NAAM> (
  <KOLOM_NAAM> [TYPE] {NULL, NOT NULL} {DEFAULT <STANDAARD_WAARDE>} {AUTO_INCREMENT}+
  [KOLOM_EIGENSCHAPPEN]+
) [OPTIES];


is dan om te schrijven naar

CREATE TABLE persoon (
  pid INT(10) AUTO_INCREMENT,
  voornaam VARCHAR(100) NOT NULL,
  tussenv VARCHAR(50),
  achternaam VARCHAR(100) NOT NULL,
  gebdat DATE DEFAULT "1900-01-01",
  geslacht ENUM("man", "vrouw"),
  telnr VARCHAR(50) NOT NULL,
  email VARCHAR(75) NOT NULL,
  notities TEXT,
  PRIMARY KEY (pid)
) TYPE=MyISAM;


We zullen kort elke regel bespreken:
CREATE TABLE persoon (
Dit deel van de query geeft aan dat we een tabel met de naam "persoon" aan willen maken.

pid INT(10) AUTO_INCREMENT,
Hier wordt een id aangemaakt. Elke persoon die in de database komt te staan krijgt een (uniek) nummer toegewezen.

voornaam VARCHAR(100) NOT NULL,
Dit deel geeft aan dat elke voornaam die ingevoerd wordt inhoud moet hebben (mag niet leeg zijn - NOT NULL), en van een string-vorm moet zijn met een maximale lengte van 100 karakters.

tussenv VARCHAR(50),
Omdat niet iedereen een tussenvoegsel in zijn/haar naam heeft, is het onverstandig om hier NOT NULL te gebruiken. Een tussenvoegsel is een string bestaande uit ten hoogste 50 karakters.

achternaam VARCHAR(100) NOT NULL,
Een achternaam, verplicht in te vullen.
String van maximaal 100 karakters.

gebdat DATE DEFAULT "1900-01-01",
Een geboortedatum van het type DATE, de standaard waarde (wanneer deze niet in een formulier wordt opgegeven) staat op 1 januari 1900. Zo kun je duidelijk zien dat iemand zijn geboortedatum niet heeft opgegeven (of heel erg oud is).

geslacht ENUM("man", "vrouw"),
Het geslacht van een persoon. Kan de waarde "man" of "vrouw" hebben (of NULL).

telnr VARCHAR(50) NOT NULL,
email VARCHAR(75) NOT NULL,

Respectievelijk het telefoonnummer (string, maximaal 50 karakters) en het emailadres (string, maximaal 75 karakters) van een persoon.
Bij het telefoonnummer is expres voor een string gekozen, zodat spaties en strepen in een telefoonnummer toegestaan zijn (en kunnen beginnen met een 0, wat bij getallen waarschijnlijk niet kan).

notities TEXT,
Een textveld voor extra notities bij deze persoon (deze mag leeg zijn).

PRIMARY KEY (pid)
Hiermee wordt aangegeven dat het veld pid uniek is, en overal ingevuld dient te zijn (dit wordt al min of meer bewerkstelligd door AUTO_INCREMENT, maar het expliciet vermelden van een PRIMARY KEY is wel zo netjes).

) TYPE=MyISAM;
Het meest gangbare tabeltype.

Extra notities:
Er zijn nog enkele extra onderdelen aan dit CREATE statement toe te voegen zoals het controleren op eigenschappen van de tabelvelden (dit wordt gedaan wanneer je gegevens probeert in te voeren), maar het is natuurlijk beter om dit eerder af te vangen (m.b.v. PHP of JavaScript eisen stellen aan de invoer).

Voor meer informatie kun je terecht op

http://www.mysql.com/doc/en/CREATE_TABLE.html
http://www.mysql.com/doc/en/Column_types.html
http://www.mysql.com/doc/en/Table_types.html


« Vorige tutorial : Inleiding Volgende tutorial : INSERT »

© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.017s