SQL-trackLes 5 van 10

🏗️ CREATE TABLE

Database-schema ontwerpen — datatypes, constraints en relaties tussen tabellen.

⏱ 30 min6 stappenInteractieve SQL-sandbox
Stap 1 / 6

Datatypes in SQLite

Elke kolom heeft een datatype dat bepaalt welke waarden erin kunnen. SQLite gebruikt vijf basis-datatypes.

SQLite Types
INTEGERGeheel getal: 1, 42, -7
REALDecimaal getal: 3.14, 99.99
TEXTTekst: 'Anna', 'email@x.nl'
BLOBBinaire data: afbeeldingen
NULLOntbrekende waarde
Veelgebruikt in MySQL/PostgreSQL
VARCHAR(255)Tekst met max lengte
BOOLEANtrue/false (SQLite: 0/1)
DATEDatum: '2024-01-15'
DATETIMEDatum + tijd
DECIMAL(10,2)Geld: 1234567890.99
SQLite is flexibel (type affinity)

SQLite laat je ook schrijven als INT, VARCHAR, BOOLEAN — het converteert intern. MySQL/PostgreSQL zijn stricter.

Stap 2 / 6

Constraints — regels afdwingen

Constraints zijn regels op kolommen die de database zelf afdwingt. Ze voorkomen ongeldige data.

PRIMARY KEY

Unieke identifier, nooit NULL. Slechts één per tabel. Gebruik AUTOINCREMENT voor automatisch oplopende id's.

id INTEGER PRIMARY KEY AUTOINCREMENT
NOT NULL

Kolom mag nooit NULL zijn. Verplicht veld.

naam TEXT NOT NULL
UNIQUE

Geen twee rijen mogen dezelfde waarde hebben. Ideaal voor e-mailadressen.

email TEXT NOT NULL UNIQUE
DEFAULT

Standaardwaarde als er niets ingevuld wordt.

actief INTEGER DEFAULT 1
FOREIGN KEY

Verwijst naar de primary key van een andere tabel. Bewaakt referentiële integriteit.

gebruiker_id INTEGER REFERENCES gebruikers(id)
Stap 3 / 6

CREATE TABLE — tabel aanmaken

Volledige syntaxis
CREATE TABLE tabel (
    kolom1  DATATYPE  CONSTRAINT,
    kolom2  DATATYPE  CONSTRAINT,
    ...
);

-- Echt voorbeeld: gebruikers-tabel
CREATE TABLE gebruikers (
    id        INTEGER  PRIMARY KEY AUTOINCREMENT,
    naam      TEXT     NOT NULL,
    email     TEXT     NOT NULL UNIQUE,
    leeftijd  INTEGER,
    actief    INTEGER  DEFAULT 1,
    aangemeld TEXT     DEFAULT (date('now'))
);
IF NOT EXISTS — veilig aanmaken
-- Geeft geen fout als de tabel al bestaat
CREATE TABLE IF NOT EXISTS gebruikers (
    id   INTEGER PRIMARY KEY,
    naam TEXT NOT NULL
);
Relatie-tabel met FOREIGN KEY
CREATE TABLE orders (
    id           INTEGER PRIMARY KEY AUTOINCREMENT,
    gebruiker_id INTEGER NOT NULL REFERENCES gebruikers(id),
    product_id   INTEGER NOT NULL REFERENCES producten(id),
    aantal       INTEGER NOT NULL DEFAULT 1,
    datum        TEXT    DEFAULT (date('now'))
);
Stap 4 / 6

ALTER TABLE & DROP TABLE

Als een tabel al bestaat maar je wilt de structuur aanpassen, gebruik je ALTER TABLE.

ALTER TABLE — kolom toevoegen
-- Kolom toevoegen
ALTER TABLE gebruikers ADD COLUMN telefoon TEXT;

-- Kolom hernoemen (SQLite 3.25+)
ALTER TABLE gebruikers RENAME COLUMN telefoon TO telefoonnummer;

-- Tabel hernoemen
ALTER TABLE gebruikers RENAME TO klanten;
🚨 DROP TABLE — permanent!
-- Verwijdert de HELE tabel inclusief alle data
DROP TABLE gebruikers;

-- Veiligere versie (geen fout als tabel niet bestaat)
DROP TABLE IF EXISTS gebruikers;

DROP TABLE is niet terug te draaien zonder backup. In productie altijd een backup maken eerst.

Migraties in frameworks

In Symfony gebruik je Doctrine Migrations. In Laravel zijn het PHP-klassen. Je schrijft zelden direct ALTER TABLE in productie — frameworks regelen dit via versiegestuurde migratiebestanden.

Stap 5 / 6

Oefening — maak je eigen tabel

🎯 Opdrachten
  1. Maak een tabel taken met: id, titel (verplicht), beschrijving, voltooid (standaard 0), aangemaakt_op
  2. Voeg 3 taken in via INSERT
  3. Toon alle taken met SELECT
  4. Markeer één taak als voltooid met UPDATE
Resultaat verschijnt hier...

🧠 Kennischeck

🏗️

Les 5 afgerond!

Je kunt nu je eigen database-schema ontwerpen met datatypes, constraints en relaties.

Les 6: Aggregaties →