You are on page 1of 51

1

Databases 2
DATABASES 2
Week 4

1
Databases 2 31-12-22
Leerdoelen

Na deze les kun je:

• INSERT, UPDATE, en DELETE toepassen op een rij


• Safe update mode aan en uitschakelen in de MySQL Workbench
• ON DELETE en ON UPDATE toepassen
• CREATE, ALTER, en DROP toepassen op een tabel
• Eenvoudige user management via de MySQL Workbench

1
Databases 2 31-12-22 |3
Introductie

1
Databases 2 31-12-22 |4
CTRL+Z

Ooit iemand een wijziging gedaan op een database waar je


achteraf spijt van had?

Q: Zit er een undo op je database?


A: Helaas niet

Dus: altijd voorzichtig zijn met UPDATE en DELETE operaties!

1
Databases 2 31-12-22 |5
Fotograaf Opdracht

Het hoorcollege van vandaag is vooral bedoeld ter ondersteuning


van het Project Databases.

Om te laten zien dat je de stof beheerst moet je de Fotograaf


Opdracht maken.

• Te vinden in Brightspace bij de opdrachten van week 4


• Je maakt de opdracht individueel
• Je laat de opdracht aftekenen door je werkcollege docent

Let op!: Heb je de opdracht niet afgetekend vóór je je


tentamen hebt gemaakt, dan wordt je cijfer voor je
tentamen achtergehouden tot je dat wel hebt gedaan.

1
Databases 2 31-12-22 |6
De C.UD uit CRUD
(voor rijen)

1
Databases 2 31-12-22 |7
INSERT

Om data aan een database toe te voegen gebruiken we het INSERT


commando.

INSERT INTO tabel (kolom1, kolom2, …)


VALUES (waarde1, waarde2, …)

1
Databases 2 31-12-22 |8
Bijvoorbeeld

INSERT INTO Werknemers


(voornaam, tussenvoegsel, achternaam, salaris)
VALUES
('Pietje', NULL, 'Puk', 25000)

Q: Het veld ID is niet ingevuld??


A: Auto Increment!

1
Databases 2 31-12-22 |9
Auto Increment

Kun je aangeven bij een kolom bij het maken van de tabel.

De database houdt dit veld bij door voor elke nieuwe rij het
nummer eentje op te hogen. Je hoeft het bij een INSERT dus niet
zelf aan te geven: de database doet het voor je.

• AI Veld moet een index hebben (en een PK heeft dat).


• Er mag maar één AI veld per tabel zijn.

1
Databases 2 31-12-22 | 10
INSERT zonder kolommen

De volgende manier is ook mogelijk voor INSERT statements:

INSERT INTO tabel


VALUES (waarde1, waarde2, …)

De kolom namen zijn weg gelaten.

De waardes worden nu in kolommen geschreven op volgorde van


de kolommen in de tabel.

Er moeten nu evenveel waardes worden opgegeven als er


kolommen zijn.

1
Databases 2 31-12-22 | 11
Bijvoorbeeld

INSERT INTO Werknemers


VALUES (NULL, 'Pietje', NULL, 'Puk', 25000)

Het Auto Increment veld moet hier wel worden opgegeven. Het
aantal kolommen moet immers kloppen.

Als je NULL of 0 invult voor het Auto Increment veld dan vult de
database zelf het goede nummer in.

1
Databases 2 31-12-22 | 12
INSERT…SELECT

Je mag ook een SELECT statement gebruiken in plaats van


VALUES.

Het resultaat van de SELECT worden dan je VALUES.

Bijvoorbeeld:

INSERT INTO werknemers


(voornaam, tussenvoegsel, achternaam, salaris)
SELECT voornaam, tussenvoegsel, achternaam, 0
FROM studenten;

1
Databases 2 31-12-22 | 13
INSERT..SELECT..Subquery

Je kunt ook een subquery gebruiken in een INSERT…SELECT

Bijvoorbeeld

Voeg alle studenten toe aan de werknemers tabel die meer


verdienen dan de gemiddelde werknemer.

INSERT INTO werknemers


(voornaam, tussenvoegsel, achternaam, salaris)
SELECT voornaam, tussenvoegsel, achternaam, salaris
FROM studenten
WHERE studenten.salaris >
(
SELECT AVG(salaris) FROM werknemers
);

1
Databases 2 31-12-22 | 14
Vraag

ID is een Auto Increment veld.

Gaat de volgende query goed?

INSERT INTO Werknemers


VALUES (10, 'Ties', 'van', 'Nies', 33000)

Antwoord:
Ja. Als ID=10 maar niet al bestaat. Anders nee. Je maakt bij deze
INSERT dus niet gebruik van de Auto Increment.
(of dat een goed idee is, is een andere vraag)

1
Databases 2 31-12-22 | 15
UPDATE één kolom

Om data in een database te wijzigen gebruiken we het UPDATE


commando.

Bijvoorbeeld:

UPDATE werknemers
SET salaris = 30000
WHERE voornaam = 'Pietje' AND achternaam = 'Puk'

of beter:

UPDATE werknemers
SET salaris = 30000
WHERE werknemerID = 1;
Rij wordt immers uniek
geïdentificeerd door de PK!
1
Databases 2 31-12-22 | 16
UPDATE meerdere rijen

De WHERE clause in de UPDATE kan voor meerdere rijen gelden.

De UPDATE wordt uitgevoerd voor iedere rij waar de WHERE waar


voor is.

Bijvoorbeeld:
Zet de opleiding op "Informatica" voor iedere student met een
studentnr boven de 200.

UPDATE studenten
SET opleiding = 'Informatica'
WHERE studentnr > 200;
Voor iedere rij waarvoor
geldt studentnr > 200 wordt
de update uitgevoerd.
1
Databases 2 31-12-22 | 17
UPDATE meerdere
kolommen

Je kunt een UPDATE statement ook gebruiken om meerdere


kolommen ineens te wijzigen.

De kolommen worden gescheiden door een komma.

Bijvoorbeeld:

UPDATE studenten
SET geboortedatum = '10-10-1999', opleiding = 'Informatica'
WHERE studentnr = 1234;

1
Databases 2 31-12-22 | 18
UPDATE…subquery

Ook bij de UPDATE kunnen we gebruik maken van een subquery.

Bijvoorbeeld:
Verhoog de salarissen van alle werknemers die wonen in
Amsterdam.

UPDATE werknemers
SET salaris = salaris * 1.1
WHERE werknemerID IN
(
SELECT werknemerID
FROM adressen
WHERE woonplaats = 'Amsterdam'
);

1
Databases 2 31-12-22 | 19
DELETE

Om rijen uit een tabel te verwijderen gebruiken we het DELETE


statement.

Bijvoorbeeld: Tip: Vervang DELETE eerst


voor SELECT * en voer die
Verwijder werknemer 123. query uit, zodat je zeker
DELETE FROM Werknemer
weet dat je de goede rijen
WHERE werknemerID = 123; weg gaat gooien.

Voorbeeld voor meerdere rijen:


Verwijder alle werknemers die Pietje heten.

DELETE FROM Werknemer


WHERE voornaam = 'Pietje';

1
Databases 2 31-12-22 | 20
UPDATE/DELETE zonder
WHERE clause

Let op! Als je de where clause weglaat bij een UPDATE of DELETE
dan wordt deze uitgevoerd voor alle rijen!

Bijvoorbeeld:
Zet de opleiding van alle studenten op "Informatica".

UPDATE studenten
SET opleiding = 'Informatica'; Er zit geen UNDO
op je database. Als
je de WHERE regel
Verwijder alle rijen uit de studenten tabel.
uit een
DELETE FROM studenten; UPDATE/DELETE
vergeet, verlies je
veel/alle informatie!
1
Databases 2 31-12-22 | 21
Safe Updates

In de MySQL Workbench kun je Safe Updates aan of uit zetten.


 Te vinden via: Edit -> Preferences. Dan SQL Editor. Dan naar
beneden scrollen voor de checkbox voor Safe Updates.

Als deze aan staat mogen er geen UPDATES of DELETE statements


worden gedaan die geen WHERE clause bevatten.

Let op: Dit geldt dus alleen voor de queries uitgevoerd in de MySQL
Workbench (de client) niet voor de MySQL Server zelf!

1
Databases 2 31-12-22 | 22
Vraag

ID is een Auto Increment veld.

Als ik drie rijen heb toegevoegd na het maken van deze tabel, en ik
heb daarna de twee laatst toegevoegde rijen weer weggegooid, wat
wordt het ID veld dan als ik een nieuwe rij toevoeg?

Antwoord:
4
De Auto Increment waarde wordt niet gewijzigd door een DELETE.

1
Databases 2 31-12-22 | 23
ON UPDATE
ON DELETE

1
Databases 2 31-12-22 | 24
DELETE een rij met een
afhankelijkheid

Stel het volgende database fragment:

Wanneer ik een bestelling wil verwijderen zal dat worden


tegengehouden door de database omdat er bestelregels aan
gekoppeld zitten.

Error Code: 1451. Cannot delete or update


a parent row: a foreign key constraint fails

1
Databases 2 31-12-22 | 25
Maar…

Het zou best wel eens gewenst gedrag kunnen zijn dat:

wanneer ik een bestelling verwijder…

alle bestelregels behorend bij die bestelling ook worden verwijderd.

Q: Hebben we hier iets voor?


A: Ja. Namelijk de ON DELETE optie.

1
Databases 2 31-12-22 | 26
ON DELETE

Kies de FK tab
Selecteer één
Selecteer de bij het maken
van de opties
foreign key met de of wijzigen van
in de drop
afhankelijkheid. een tabel.
down list.

1
Databases 2 31-12-22 | 27
ON DELETE opties

RESTRICT is
hetzelfde als NO CASCADE: Herhaal de DELETE op alle rijen die
ACTION in MySQL. afhankelijk zijn van de verwijderde rij. Verwijder
dus alle bestelregels die aan de bestelling
gekoppeld zijn die je wil verwijderen.

SET NULL: Wanneer je een rij verwijdert


worden alle FK velden in de afhankelijke
tabel NULL. Uiteraard alleen mogelijk
wanneer die velden NULLABLE zijn.

NO ACTION: De default. De server geeft


een error als er bestelregels zijn die aan
de bestelling gekoppeld zijn die je wil
verwijderen.

1
Databases 2 31-12-22 | 28
Welke tabel?

Een ON DELETE optie zetten we altijd op de afhankelijke tabel,


niet op de tabel met de te verwijderen rij.

In het voorbeeld zetten we hem dus op de bestelregel tabel, niet


op de bestelling tabel.

Reden: Als er meerdere tabellen afhankelijk zijn willen we per tabel


aangeven of er regels automatisch verwijderd moeten worden.

1
Databases 2 31-12-22 | 29
Voorbeeld

Hier willen we dat alle


bestelregels verwijderd
worden als er een
bestelling verwijderd
wordt.

Maar we willen niet dat er


bestellingen verwijderd
worden waar nog ON DELETE CASCADE
bijzonderheden bij
vermeld staan.

Als er nu een DELETE


wordt gedaan op een ON DELETE NO ACTION
bestelling met een
bijzonderheid, treed er een
error op.

1
Databases 2 31-12-22 | 30
ON UPDATE

Stel je hebt het volgende database fragment:

Wanneer je de naam van een persoon wijzigt waar rijen in de


eigendom tabel van afhankelijk zijn, geeft de database een
foutmelding.

Error Code: 1451. Cannot delete or update


a parent row: a foreign key constraint fails

1
Databases 2 31-12-22 | 31
ON UPDATE

Dit zijn dezelfde opties als bij ON


DELETE, met dezelfde betekenis: Dit kunnen we wel
• RESTRICT mogelijk maken via de
• CASCADE ON UPDATE opties.
• SET NULL
• NO ACTION

1
Databases 2 31-12-22 | 32
Vraag

Welke optie hebben we nodig om er voor te zorgen dat als er een


bestelling verwijderd wordt alle bestelregels ook verwijderd worden?

Antwoord:
ON DELETE CASCADE

Op welke tabel moet deze optie gezet worden?

Antwoord:
Op de bestelregels tabel.

1
Databases 2 31-12-22 | 33
De C.UD uit CRUD
(voor tabellen)

1
Databases 2 31-12-22 | 34
C.UD

Create: CREATE TABLE


Update: ALTER TABLE
Delete: DROP TABLE

1
Databases 2 31-12-22 | 35
Laten doen

Je kunt je model laten genereren door MySQL Workbench:

Database -> Forward Engineer

Of:
<CTRL>+<G>

Er wordt een script gegenereerd door de MySQL Workbench waarin alle


CREATE TABLEs e.d. staan.

Dat script kun je dan opslaan om ergens op een database server uit te
voeren.
Of je kunt dat script direct uit laten voeren op de server waar je op dat
moment een connection mee hebt.

Het script maakt je daadwerkelijke database aan.

1
Databases 2 31-12-22 | 36
Zelf doen

In plaats van automatische generatie van dat script kun je ook zelf
de SQL code schrijven om tabellen te maken of te veranderen.

Deze instructies vallen onder de DDL (Data Definition Language).

1
Databases 2 31-12-22 | 37
CREATE TABLE voorbeeld

Alleen als deze tabel nog niet bestaat Tabel naam


Kolom CREATE TABLE IF NOT EXISTS `mydb`.`artikelen` (
namen `ID` INT(11) NOT NULL,
`categorie` VARCHAR(100) NOT NULL, Deze kolom is not nullable
`artikelnaam` VARCHAR(100) NOT NULL,
`omschrijving` VARCHAR(1000) NULL DEFAULT NULL, Deze kolom
`prijs` DECIMAL(10,2) NOT NULL, heeft als default
PK PRIMARY KEY (`ID`), waarde NULL
UNIQUE INDEX `categorie_UNIQUE` (`categorie` ASC,
`artikelnaam` ASC),
INDEX `prijs_INDEX` (`prijs` ASC)); Hier wordt een Unique Index
op de categorie en
Hier wordt een Index op de
artikelnaam kolommen
prijs kolom tegelijk met de
tegelijk met de tabel
tabel aangemaakt.
aangemaakt.

1
Databases 2 31-12-22 | 38
ALTER TABLE voorbeeld

Tabel naam
ALTER TABLE `mydb`.`artikelen`
DROP COLUMN `categorie`,
CHANGE COLUMN `omschrijving` `omschrijving` VARCHAR(1000)
NOT NULL DEFAULT '' ,
ADD COLUMN `naamControleur` VARCHAR(100) NULL AFTER
`prijs`,
DROP INDEX `categorie_UNIQUE` ,
ADD UNIQUE INDEX `naam_UNIQUE` (`artikelnaam` ASC);

Instructies Een aantal


instructies
gescheiden door
komma

1
Databases 2 31-12-22 | 39
DROP TABLE voorbeeld

Tabel naam
DROP TABLE `mydb`.`artikelen`;

Let op: (Nog steeds) geen undo op de database!

1
Databases 2 31-12-22 | 40
USER MANAGEMENT
en PRIVILEGES

1
Databases 2 31-12-22 | 41
Users in MySQL Workbench

Hier kun je zien welke


users er bestaan voor
deze server.
Hier kun je ook nieuwe
users aanmaken.

1
Databases 2 31-12-22 | 42
User maken/wijzigen
Geef de gebruiker
een naam Laat deze op
standard staan.

Volgende slide

Vul hier het wachtwoord in


voor de (nieuwe) gebruiker 31-12-22 | 43

1
Databases 2
Limit to Hosts Matching

Wordt gebruikt om te beperken vanaf welk systeem deze user contact


mag maken met deze server.

% : Overal vandaan
Localhost : Alleen vanaf de computer waar de server op draait
198.51.100.177 : Alleen vanaf ip adres 198.51.100.177
198.51.100.% : Vanaf alle ip adressen die beginnen met 198.51.100
Avans.nl : Alleen vanuit het avans.nl domein

etc.

Wij zullen vooralsnog alleen % gebruiken en eventueel localhost.

1
Databases 2 31-12-22 | 44
Account Limits

Indien gewenst kun je hier aangeven voor een gebruiker:


• Hoe vaak deze queries mag uitvoeren op deze server
• Hoe vaak deze updates mag doen op deze server
• Hoe vaak deze contact mag maken met deze server per uur
• Hoeveel gelijktijdige connecties deze gebruiker mag hebben

Een waarde van 0 betekent: ongelimiteerd.

1
Databases 2 31-12-22 | 45
Administrative Roles

Aan elke rol die je links kan selecteren hangen één of meerdere
privileges die je aan de rechterkant ziet staan. Selecteer je een rol,
dan worden automatisch de daarbij horende privileges geselecteerd.

Als je zelf rechts privileges selecteerd creëer je een custom role.

Het gaat hierbij om global privileges dat wil zeggen:


Deze rechten gelden voor alle databases op deze server.
1
Databases 2 31-12-22 | 46
Schema privileges

Hier kun je per database invullen wat de rechten zijn voor deze
gebruiker.

Bijvoorbeeld: Door alleen SELECT aan te vinken heeft deze


gebruiker alleen maar lees rechten op deze database.
1
Databases 2 31-12-22 | 47
Privileges

Je kunt dus per gebruiker aangeven welke privileges deze heeft.

Elke privilege staat voor een bepaald soort actie dat er op een
database server gedaan kan worden.

Bijvoorbeeld:
SELECT : Met deze privilege mag een gebruiker data lezen.
UPDATE : Met deze privilege mag een gebruiker velden wijzigen.
CREATE : Met deze privilege mag een gebruiker nieuwe tabellen
maken.
CREATE VIEW : Met deze privilege mag een gebruiker een view
maken.

etc.

Voor de hele lijst zie:


https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html

1
Databases 2 31-12-22 | 48
Privileges per Tabel

Q: Is het mogelijk om privileges per gebruiker per tabel aan te


geven?

A: Ja. Maar niet via het rechten scherm van de MySQL Workbench.
Alleen via een Query.

Bijvoorbeeld:
GRANT SELECT,INSERT,UPDATE,DELETE ON
mydatabase.table_name TO 'username'@'localhost';

Deze query voegt SELECT, INSERT, UPDATE, en DELETE privileges


toe aan gebruiker username op de server die draait op localhost in
de database die mydatabase heet op de tabel table_name

1
Databases 2 31-12-22 | 49
Vraag

Stel ik heb een role die mij global update privileges geeft op een
server.
Daarnaast heb ik (op dezelfde server) op mijndatabase alleen
select privileges.

Mag ik in mijndatabase wijzigingen maken?

Antwoord:
Ja. De gebruiker heeft immers rechten hierop via de global update
privileges.

1
Databases 2 31-12-22 | 50
Vragen?

1
Databases 2 31-12-22 | 51

You might also like