====== 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) ++++ ----