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
|