====== Constraints i MariaDB/MySQL ======
Disse øvelser dækker oprettelse, ændring og test af Constraints i MariaDB/MySQL
* Primærnøgle
* Fremmednøgle
* UNIQUE
* sammensatte nøgler
* NOT NULL
----
==== Øvelse 1: Opret en tabel med primærnøgle ====
**Opgave:**
Opret tabel ''Kunde'' med kolonner:
- KundeID (INT) som primærnøgle
- Navn (VARCHAR)
- Email (VARCHAR)
++++ Løsning |
CREATE TABLE Kunde (
KundeID INT PRIMARY KEY,
Navn VARCHAR(50),
Email VARCHAR(50)
);
++++
**Test:**
INSERT INTO Kunde (KundeID, Navn, Email) VALUES (1, 'Anna Hansen', 'anna@mail.dk');
INSERT INTO Kunde (KundeID, Navn, Email) VALUES (2, 'Peter Jensen', 'peter@mail.dk');
-- Forsøg på duplikat PK (skal fejle)
INSERT INTO Kunde (KundeID, Navn, Email) VALUES (1, 'Ole Olsen', 'ole@mail.dk');
-- Fejl: Duplicate entry '1' for key 'PRIMARY'
----
==== Øvelse 2: Tilføj UNIQUE constraint ====
**Opgave:**
Sørg for, at ''Email'' er unik, så ingen to kunder kan have samme email.
++++ Løsning 1 (ved oprettelse af ny) |
CREATE TABLE Kunde (
KundeID INT PRIMARY KEY,
Navn VARCHAR(50),
Email VARCHAR(50) UNIQUE
);
++++
++++ Løsning 2 (til eksisterende tabel): |
ALTER TABLE Kunde
ADD CONSTRAINT unik_email UNIQUE (Email);
++++
**Test:**
INSERT INTO Kunde (KundeID, Navn, Email) VALUES (3, 'Lise Hansen', 'anna@mail.dk');
-- Fejl: Duplicate entry 'anna@mail.dk' for key 'unik_email'
----
==== Øvelse 3: Opret autogenereret primærnøgle ====
**Opgave:**
Opret tabel ''Produkt'' med:
- ProduktID INT AUTO_INCREMENT som PK
- Navn VARCHAR
- Pris FLOAT
++++ Løsning |
CREATE TABLE Produkt (
ProduktID INT AUTO_INCREMENT PRIMARY KEY,
Navn VARCHAR(50),
Pris DECIMAL(10,2)
);
++++
**Test:**
INSERT INTO Produkt (Navn, Pris) VALUES ('Mus', 199.95);
INSERT INTO Produkt (Navn, Pris) VALUES ('Tastatur', 349.50);
SELECT * FROM Produkt;
-- ProduktID | Navn | Pris
-- 1 | Mus | 199.95
-- 2 | Tastatur | 349.50
----
==== Øvelse 4: Opret fremmednøgle ====
**Opgave:**
Opret tabel ''Ordre'' med:
- OrdreID INT AUTO_INCREMENT som PK
- KundeID INT som FK til Kunde(KundeID)
- Dato DATE
++++ Løsning |
CREATE TABLE Ordre (
OrdreID INT AUTO_INCREMENT PRIMARY KEY,
KundeID INT,
Dato DATE,
FOREIGN KEY (KundeID) REFERENCES Kunde(KundeID)
);
++++
**Test:**
-- Korrekt indsættelse
INSERT INTO Ordre (KundeID, Dato) VALUES (1, '2026-01-25');
-- Forkert indsættelse (ikke eksisterende KundeID)
INSERT INTO Ordre (KundeID, Dato) VALUES (99, '2026-01-25');
-- Fejl: Cannot add or update a child row: a foreign key constraint fails
----
==== Øvelse 5: Opret sammensat primærnøgle ====
**Opgave:**
Opret tabel ''OrdreLinje'' med:
- OrdreID INT
- ProduktID INT
- Antal INT
- Primærnøgle: kombination af OrdreID + ProduktID
**Test:**
-- Indsæt en ordrelinje (skal lykkes)
INSERT INTO OrdreLinje (OrdreID, ProduktID, Antal) VALUES (101, 1, 2);
-- Forsøg at indsætte samme kombination igen (skal fejle)
INSERT INTO OrdreLinje (OrdreID, ProduktID, Antal) VALUES (101, 1, 5);
-- Indsæt samme ProduktID med en anden OrdreID (skal lykkes)
INSERT INTO OrdreLinje (OrdreID, ProduktID, Antal) VALUES (102, 1, 3);
++++ Løsning/Hint |
CREATE TABLE OrdreLinje (
OrdreID INT,
ProduktID INT,
Antal INT,
PRIMARY KEY (OrdreID, ProduktID)
);
++++
----
==== Øvelse 6: Ændre primærnøgle ====
**Opgave:**
I tabellen ''Kunde'' skal du ændre primærnøgle fra KundeID til Email (for eksperiment).
**Test:**
-- Indsæt kunde med unik Email (skal lykkes)
INSERT INTO Kunde (KundeID, Navn, Email) VALUES (10, 'Mette Larsen', 'mette@mail.dk');
-- Indsæt kunde med eksisterende Email (skal fejle)
INSERT INTO Kunde (KundeID, Navn, Email) VALUES (11, 'Ole Hansen', 'mette@mail.dk');
-- Kontroller primærnøglen
DESCRIBE Kunde;
++++ Løsning/Hint |
ALTER TABLE Kunde
DROP PRIMARY KEY,
ADD PRIMARY KEY (Email);
++++
----
==== Øvelse 7: Tilføj fremmednøgle til eksisterende tabel ====
**Opgave:**
Antag at ''OrdreLinje'' allerede eksisterer uden FK.
* Tilføj FK OrdreID → Ordre(OrdreID)
* Tilføj FK ProduktID → Produkt(ProduktID)
**Test**
-- Indsæt gyldig ordrelinje (skal lykkes)
INSERT INTO OrdreLinje (OrdreID, ProduktID, Antal) VALUES (101, 1, 2);
-- Forsøg med ikke-eksisterende OrdreID (skal fejle)
INSERT INTO OrdreLinje (OrdreID, ProduktID, Antal) VALUES (999, 1, 1);
-- Forsøg med ikke-eksisterende ProduktID (skal fejle)
INSERT INTO OrdreLinje (OrdreID, ProduktID, Antal) VALUES (101, 999, 1);
-- Tjek strukturen
SHOW CREATE TABLE OrdreLinje;
++++ Løsning/Hint |
ALTER TABLE OrdreLinje
ADD CONSTRAINT fk_ordre FOREIGN KEY (OrdreID) REFERENCES Ordre(OrdreID),
ADD CONSTRAINT fk_produkt FOREIGN KEY (ProduktID) REFERENCES Produkt(ProduktID);
* Bemærk navngivning af FOREIGN KEY, for senere at kunne referere til FK. Udelades navn for FK, tildeler system selv et generisk navn til FK. (prøv det,..prøv det)
++++
----