basics mysql foreign key constraint with examples
Denne opplæringen forklarer det grunnleggende i MySQL FOREIGN KEY Constraint, for eksempel syntaksen, hvordan du legger til, erklærer, slipper og endrer den med eksempler:
I svært enkle vendinger brukes UTENLANDSK Nøkkel til å koble to eller flere tabeller i MySQL.
MySQL-tabeller må kobles til for å kunne spørre og oppdatere forskjellige typer data på forskjellige tidspunkter. Derfor er det viktig å ha et koblingspunkt mellom to tabeller.
I denne opplæringen vil vi diskutere forskjellige bruksområder for utenlandske nøkler og hvordan kan deklareres og endres, og hvilke begrensninger den har for den generelle tabellstrukturen.
Hva du vil lære:
MySQL UTENLANDSK NØkkel
Syntaks:
CONSTRAINT {constraintName} FOREIGN KEY (referringColumnName) REFERENCES {referredTable}({referredColumn}) ON UPDATE {reference-option} ON DELETE {reference-option}
Ovenfor er syntaksen som brukes når du spesifiserer UTENLANDSK Nøkkel mot et bord mens du oppretter eller med ALTER TABLE uttalelse.
La oss forstå de forskjellige komponentene i syntaksen:
- constrantName: Dette er det symbolske navnet vi vil definere for FK-begrensningen som blir spesifisert. Hvis dette hoppes over, tilordner MySQL-motoren automatisk et navn til FK-begrensningen.
- referringColumnName: Dette er kolonnen som vil referere til verdiene i en annen tabell som spesifisert av kolonnen i den henviste tabellen.
- Referert tabell / foreldretabell: Dette refererer til navnet på tabellen som verdiene vil bli henvist fra.
- Referert kolonne: Kolonnenavnet i den henviste tabellen.
- Referansealternativ: Dette er handlingene som kommer inn i bildet når en oppdatering eller sletting utføres på bordet som har begrensningen for fremmednøkkelen. Både OPPDATERING og SLETTING kan ha samme eller forskjellige referansealternativer.
Vi vil lære om forskjellige referanseintegritetshandlinger senere i denne opplæringen.
La oss se et eksempel på en UTENLANDSK Nøkkelhenvisning ved hjelp av eksemplet Ansatt / avdeling. Vi vil lage en tabell Avdeling med kolonner - departmentId (int & PRIMARY KEY) og departmentName (varchar).
CREATE TABLE department(departmentId INT PRIMARY KEY NOT NULL, departmentName VARCHAR(100));
Lag en tabell Ansatt med kolonner som nedenfor:
Kolonne | Type |
---|---|
id | INT (primærnøkkel) |
Navn | VARCHAR |
dept_id | INT (Foreign Key) referert fra avdelingstabellen |
adresse | VARCHAR |
alder | INT |
dob | DATO |
CREATE TABLE employee(id INT PRIMARY KEY NOT NULL, name VARCHAR(100), address VARCHAR(100), age INT, dob DATE, deptId INT, CONSTRAINT depIdFk FOREIGN KEY (deptId) REFERENCES department(departmentId) ON UPDATE CASCADE ON DELETE CASCADE);
Som du kan se, har vi i de ovennevnte medarbeidertabellene erklært deptId-kolonne av typen Int og definert UTENLANDSK Nøkkel fra avdelingstabellen på kolonne departmentId.
Hva dette egentlig betyr at deptId-kolonnen i medarbeidertabellen bare kan inneholde verdier som er i avdelingstabellen.
La oss prøve å sette inn data i disse tabellene og se hvordan UTENLANDSK NØKKELKONSTRAINT fungerer.
- Opprett en post i avdelingstabellen først, og legg til en post i medarbeidertabellen som refererer til ID-en for posten som ble lagt til i avdelingstabellen.
INSERT INTO department VALUES (1, 'ENGINEERING') --------- INSERT INTO EMPLOYEE VALUES (1, 'AMIT KUMAR', 'MUMBAI', 32, '1988-02-12',1);
Du vil se at begge utsagnene blir utført uten feil.
- Henvis nå til en verdi for departmentId som ikke eksisterer.
For eksempel, i spørringserklæringen nedenfor oppretter vi en ansatt med en ikke-eksisterende departmentId -10
INSERT INTO EMPLOYEE VALUES (1, 'DARREN JOHNSON', 'CHICAGO', 32, '1988-02-12',10);
- I dette scenariet får vi en feil som nedenfor:
Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (`my_sql_foreign_key`.`employee`, CONSTRAINT `depIdFk` FOREIGN KEY (`deptId`) REFERENCES `department` (`departmentId`) ON DELETE CASCADE ON UPDATE CASCADE)
Så når det er definert UTENLANDSKE Nøkkelhenvisninger, er det viktig å sikre at tabellen det refereres til skal ha data før den blir henvist.
Referanseintegritetshandlinger
La oss først prøve å forstå hva som egentlig er referanseintegritet.
Referential Integrity hjelper til med å opprettholde data i en ren og konsistent tilstand der det er tabeller relatert til hverandre med et UTENLANDSK Nøkkelforhold.
beste gratis Windows 10 reparasjonsprogramvare
Enkelt sagt refererer referensintegritet til handlingen vi forventer av databasemotoren å utføre når en OPPDATERING eller SLETTING skjer i den refererte tabellen som inneholder UTENLANDSK Nøkkel.
For eksempel, i vårt eksempel på ansatt / avdeling, anta at vi endrer avdelings-ID for en bestemt rad i DB. Da vil alle referanserader i medarbeidertabellen bli påvirket. Vi kan definere forskjellige typer referanseintegritetsscenarier som kan brukes i slike tilfeller.
Merk: Referanseintegritet er definert under UTLANDS NØKKELoppsett / erklæring som en del av kommandoer / seksjoner PÅ SLETTE og PÅ OPPDATERING.
Se et eksempelspørsmål her (for eksempel på ansatt / avdeling):
CREATE TABLE department(departmentId INT PRIMARY KEY NOT NULL, departmentName VARCHAR(100)); CREATE TABLE employee(id INT PRIMARY KEY NOT NULL, name VARCHAR(100), address VARCHAR(100), age INT, dob DATE, deptId INT, CONSTRAINT depIdFk FOREIGN KEY (deptId) REFERENCES department(departmentId) ON UPDATE {ref-integrity-action} ON DELETE {ref integrity action});
Sett inn noen data i disse tabellene som nedenfor:
INSERT INTO department VALUES (1, 'ENGINEERING'), (2,'ACCOUNTING'), (3, 'MARKETING'), (4, 'HR'), (5, 'LEGAL'); INSERT INTO EMPLOYEE VALUES (1, 'AMIT KUMAR', 'MUMBAI', 32,'1988-02-12',1), (2, 'RYAN HILMAN', 'SEATTLE',43, '1977-03-15',1), (3, 'KAVITA SINGH', 'DELHI', 42, '1978-02-18',4), (4, 'DAVID BECKHAM', 'LONDON', 40, '1980-07-13',3), (5, 'PRITI KUMARI', 'DELHI', 35, '1985-12-11',2), (6, 'FRANK BALDING', 'NEW YORK', 35, '1985-08-25',5)
Det er 4 referansehandlinger som støttes av MySQL. La oss prøve å forstå hver enkelt av dem.
# 1) CASCADE
Dette er en av de mest brukte Referential Integrity Actions. Hvis du setter SLETT og OPPDATERING til CASCADE, vil endringene som er gjort i den refererte tabellen på referansetabellen, brukes i eksempel på ansatt / avdeling. Anta at noen sletter en rad i avdelingstabellen med å si avdelingsnavn = REGNSKAP, så blir også alle radene i medarbeidertabellen som har avdeling_id som for regnskapstabellen slettet.
La oss forstå dette med et eksempel:
SELECT * FROM employee;
id | Navn | adresse | alder | dob | avd |
---|---|---|---|---|---|
1 | AMIT KUMAR | MUMBAI | 32 | 1988-02-12 | 1 |
to | RYAN HILMAN | SEATTLE | 43 | 1977-03-15 | 1 |
3 | KAVITA SINGH | DELHI | 42 | 1978-02-18 | 4 |
4 | DAVID BECKHAM | LONDON | 40 | 1980-07-13 | 3 |
5 | PRITI KUMARI | DELHI | 35 | 1985-12-11 | to |
6 | FRANK BALDING | NEW YORK | 35 | 1985-08-25 | 5 |
Slett posten fra avdelingstabellen der departmentName = 'ACCOUNTING'
DELETE from DEPARTMENT WHERE departmentName='ACCOUNTING';
Nå, siden det er en CASCADE-referansehandling, forventer vi at alle radene som har departmentID = 2 (som er for 'REGNSKAP' -avdelingen) også bør slettes. La oss gjøre et SELECT-spørsmål på tabellen medarbeidere igjen.
SELECT * FROM employee;
id | Navn | adresse | alder | dob | avd |
---|---|---|---|---|---|
1 | AMIT KUMAR | MUMBAI | 32 | 1988-02-12 | 1 |
to | RYAN HILMAN | SEATTLE | 43 | 1977-03-15 | 1 |
3 | KAVITA SINGH | DELHI | 42 | 1978-02-18 | 4 |
4 | DAVID BECKHAM | LONDON | 40 | 1980-07-13 | 3 |
6 | FRANK BALDING | NEW YORK | 35 | 1985-08-25 | 5 |
Som du kan se ovenfor, på grunn av CASCADE referanseintegritet, vil radene i medarbeidertabellen som refererte til den slettede kolonnen som UTENLANDSK TAST, ha disse radene slettet.
# 2) BEGRENSNING / INGEN HANDLING
BEGRENSNING eller INGEN HANDLING-modus tillater ikke OPPDATERING eller SLETT-operasjoner på tabellen med kolonner som det refereres til UTENLANDSK Nøkkel i noen tabeller.
NO ACTION-modus kan brukes ved ganske enkelt å utelate klausulene PÅ OPPDATERING og PÅ SLETT fra tabellerklæringen.
La oss prøve det samme eksemplet, og i dette tilfellet hopper du bare over OPPDATERING og PÅ SLETT Referanseintegritetshandling.
Nå når vi prøver å slette en oppføring i den refererte tabellen, vil vi få en feil da vi har satt referansehandlingen til RESTRICT
DELETE FROM department WHERE departmentName='ACCOUNTING';
Du vil se en feil som ligner på nedenfor hvis du prøver å utføre ovenstående DELETE-kommando.
Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails (`my_sql_foreign_key`.`employee`, CONSTRAINT `depIdFk` FOREIGN KEY (`deptId`) REFERENCES `department` (`departmentId`))
# 3) SET NULL
Med SET NULL vil enhver OPPDATERING eller SLETTING i den refererte tabellen føre til at en NULL-verdi oppdateres mot kolonneverdien som er merket som UTENLANDSK Nøkkel i referansetabellen.
Med denne referanseintegritetshandlingen vil definisjonen av tabellen over ansatte bli som nedenfor:
CREATE TABLE employee(id INT PRIMARY KEY NOT NULL, name VARCHAR(100), address VARCHAR(100), age INT, dob DATE, deptId INT, CONSTRAINT depIdFk FOREIGN KEY (deptId) REFERENCES department(departmentId) ON DELETE SET NULL);
Slett en rad i den refererte tabellen som vist nedenfor:
DELETE FROM department WHERE departmentName='ACCOUNTING';
Nå, i dette tilfellet, vil den refererte verdien i medarbeidertabellen bli satt til NULL. Gjør et SELECT-spørsmål på medarbeidertabellen for å se resultatene.
SELECT * FROM employee;
id | Navn | adresse | alder | dob | avd |
---|---|---|---|---|---|
1 | AMIT KUMAR | MUMBAI | 32 | 1988-02-12 | 1 |
to | RYAN HILMAN | SEATTLE | 43 | 1977-03-15 | 1 |
3 | KAVITA SINGH | DELHI | 42 | 1978-02-18 | 4 |
4 | DAVID BECKHAM | LONDON | 40 | 1980-07-13 | 3 |
5 | PRITI KUMARI | DELHI | 35 | 1985-12-11 | NULL |
6 | FRANK BALDING | NEW YORK | 35 | 1985-08-25 | 5 |
# 4) STILL STANDARD
SET DEFAULT-modus når den er spesifisert, vil føre til at standardverdien erstattes av kolonnen (som spesifisert under kolonnedeklarasjonen), hvis det vises til SLETTER i tabellen.
Merk - Iht MySQL-dokumentasjon , er alternativet SET DEFAULT støttet av MySQL Parser, men ikke DB-motorer som InnoDB. Dette kan støttes i fremtiden.
For å støtte slik oppførsel kan du imidlertid vurdere å bruke SET NULL og definere en trigger på bordet som kan angi en standardverdi.
Legg til UTENLANDSK Nøkkelbegrensning ved hjelp av ALTER TABLE-setningen
Mange ganger kan det skje at vi kanskje vil legge til en UTENLANDSK Nøkkelbegrensning i en eksisterende tabell som ikke har den.
Anta at i eksemplet medarbeider og avdeling opprettet vi en ansattstabell uten UTENLANDSK Nøkkelbegrensning, og senere vil vi introdusere begrensningen. Dette kan oppnås ved å bruke ALTER TABLE-kommandoen.
La oss prøve å forstå dette med et eksempel.
Anta at vi har en ansattstabell med definisjonen nedenfor for CREATE-kommando.
CREATE TABLE employee(id INT PRIMARY KEY NOT NULL, name VARCHAR(100), address VARCHAR(100), age INT, dob DATE, deptId INT);
Her har vi en kolonneavdeling, men ingen UTENLANDSK Nøkkelbegrensning. I dette tilfellet, selv uten å ha en avdelingstabell, kan vi spesifisere noen verdier mens vi setter inn poster.
La oss senere anta at vi har en egen avdelingstabell, og at vi vil koble avdelingen der som UTENLANDSK Nøkkel til arbeidstabellen.
ALTER TABLE employee ADD CONSTRAINT depIdFk FOREIGN KEY (deptId) REFERENCES department(departmentId) ON UPDATE CASCADE ON DELETE CASCADE;
Hva om denne tabellen har eksisterende data? Kan vi endre bord og legge til UTENLANDSK Nøkkelbegrensning?
Svaret er ja - vi kan med den forutsetning at de eksisterende verdiene i kolonnen som skal refereres til fra en annen tabell, skal ha de verdiene som finnes i selve foreldretabellen.
Opprett en medarbeidertabell uten UTENLANDSK KEY-begrensning, legg til litt data, og prøv å legge til en UTENLANDSK KEY-begrensning ved å bruke ALTER-kommandoen.
CREATE TABLE employee(id INT PRIMARY KEY NOT NULL, name VARCHAR(100), address VARCHAR(100), age INT, dob DATE, deptId INT);
INSERT INTO EMPLOYEE VALUES (1, 'DARREN JOHNSON', 'CHICAGO', 32, '1988-02-12',1); INSERT INTO EMPLOYEE VALUES (2, 'ANITA SHERWIN', 'COLUMBIA', 32, '1988-02-12',10);
Opprett en avdelingstabell og legg til UTENLANDSK Nøkkel mot 'deptId' -feltet i medarbeidertabellen som vist nedenfor:
CREATE TABLE department(departmentId INT PRIMARY KEY NOT NULL DEFAULT 1000, departmentName VARCHAR(100));
På dette punktet, hvis vi prøver å legge til UTENLANDSK Nøkkelbegrensning,
ALTER TABLE employee ADD CONSTRAINT depIdFk FOREIGN KEY (deptId) REFERENCES department(departmentId) ON UPDATE CASCADE ON DELETE CASCADE;
Deretter får vi en feil, siden medarbeidertabellen inneholder noen data, men begrensningen for referanseintegritet ikke kan oppfylles, siden avdelingstabellen ikke har noen data ennå.
Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (`my_sql_foreign_key`.`#sql-63_87`, CONSTRAINT `depIdFk` FOREIGN KEY (`deptId`) REFERENCES `department` (`departmentId`) ON DELETE CASCADE ON UPDATE CASCADE)
For å ha UTENLANDSK Nøkkelbegrensning, må vi først legge til data i avdelingstabellen. La oss sette inn de nødvendige postene i avdelingstabellen.
INSERT INTO department VALUES (1, 'ENGINEERING'),(10,'ACCOUNTING');
Legg til UTENLANDSK Nøkkelbegrensning igjen ved å utføre den samme ALTER TABLE-setningen. Du vil legge merke til at denne gangen er kommandoen vellykket og medarbeidertabellen er oppdatert for å ha deptId som UTENLANDSK Nøkkel fra avdelingstabellen.
Dropper EN UTENLANDSK Nøkkelbegrensning
I likhet med å legge til en UTENLANDSK Nøkkelbegrensning, er det også mulig å slette / slette en eksisterende UTENLANDSK Nøkkelbegrensning fra en tabell.
Dette kan oppnås ved å bruke ALTER TABLE-kommandoen.
Syntaks:
ALTER TABLE {childTable} DROP FOREIGN KEY {foreign key constraint name};
Her er ‘childTable’ navnet på tabellen som har UTENLANDSK Nøkkelbegrensning definert, mens ‘fremmednøkkelbegrensningsnavn’ er navnet / symbolet som ble brukt til å definere UTENLANDSK Nøkkel.
La oss se et eksempel ved å bruke tabellen Ansatt / avdeling. For å slippe en begrensning kalt ‘depIdFk’ fra medarbeidertabellen, bruk kommandoen nedenfor:
ALTER TABLE employee DROP FOREIGN KEY depIdFk;
ofte stilte spørsmål
Sp # 1) Hvordan kan jeg bytte fremmednøkler i MySQL?
Svar: FOREGIN KEY kan legges til / fjernes ved hjelp av ALTER TABLE-kommandoen.
For å endre eller legge til en ny UTENLANDSK Nøkkel, kan du bruke ALTER-kommandoen og definere UTENLANDSK Nøkkel og referansetabellkolonne som det vil bli referert til fra underordnet tabell.
Q # 2) Hvordan angir du flere utenlandske nøkler i MySQL?
Svar: En tabell i MySQL kan ha flere UTENLANDSKE NØKLER, som kan avhenge av samme overordnede tabell eller forskjellige overordnede tabeller.
La oss bruke tabellen medarbeider / avdeling og legge til UTENLANDSK NØKKEL for avdelingsnavn så vel som DepartmentId i medarbeidertabellen.
Henvis til CREATE uttalelsene i begge tabellene som nedenfor
CREATE TABLE department(departmentId INT PRIMARY KEY NOT NULL DEFAULT 1000, departmentName VARCHAR(100) UNIQUE NOT NULL); ----xxxxx------xxxxx------xxxxx-------xxxxx------xxxxx CREATE TABLE employee(id INT PRIMARY KEY NOT NULL, name VARCHAR(100), address VARCHAR(100), age INT, dob DATE, deptId INT, depName VARCHAR(100), CONSTRAINT depIdFk FOREIGN KEY (deptId) REFERENCES department(departmentId) ON UPDATE CASCADE ON DELETE CASCADE, CONSTRAINT depNameFk FOREIGN KEY (depName) REFERENCES department(departmentName) ON UPDATE CASCADE ON DELETE CASCADE);
Sp # 3) Hvordan deaktiverer du begrensninger for utenlandske nøkler i MySQL?
Svar: UTENLANDSKE Nøkkelbegrensninger kreves vanligvis når noen prøver å avkorte en eksisterende tabell som det blir referert til. For å gjøre det kan du bruke kommandoen nedenfor:
SET FOREIGN_KEY_CHECKS=0;
Dette vil angi en sesjonsvariabel og midlertidig deaktivere FOREIGN_KEY_CHECKS. Etter denne innstillingen kan du fortsette og utføre slettinger / avkortinger, som ellers ikke ville vært mulig.
Men vær så snill å sørge for at dette er et administratorrettighet og skal brukes med omhu.
Spørsmål nr. 4) Hvordan finner jeg referanser for utenlandske nøkler for en tabell i MySQL?
Svar: For å liste opp alle de UTENLANDSKE Nøkkelbegrensningene som er til stede, kan du bruke 'INNODB_FOREIGN_COLS' tabellen i 'INFORMATION_SCHEMA'.
Bare kjør kommandoen nedenfor for å få alle UTENLANDSKE KEY-erklæringer som eksisterer for en gitt MySQL-serverforekomst.
ID | FOR_COL_NAME | REF_COL_NAME | POS |
---|---|---|---|
my_sql_foreign_key / depIdFk | avd | avdelingId | 1 |
Q # 5) Bør den refererte kolonnen som UTENLANDSK NØkkel være en primærnøkkel i den refererte tabellen?
Svar: Per definisjon av UTENLANDSK Nøkkel, ville det være nødvendig at kolonnen som det refereres til UTENLANDSK NØkkel, skal være HOVEDNØKKELEN fra tabellen der den refereres til.
Imidlertid, med de nyere versjonene av MySQL og med InnoDB-databasemotoren, kan du også referere til en kolonne som har UTENLANDSK Nøkkel som har en UNIK begrensning og kanskje ikke nødvendigvis er PRIMÆR NØKKEL.
Q # 6) Oppretter UTLANDSNØKKEL INDEKS i MySQL?
Svar: For både primærnøkkel og unik begrensning oppretter MySQL automatisk en INDEKS for slike kolonner.
Siden vi allerede vet at UTENLANDSKE Nøkkelhenvisninger bare kan brukes på begge kolonnene som er Primære nøkler eller kolonnene som har unike verdier, har alle kolonnene som blir referert til UTENLANDSKE NØKKEN, en indeks opprettet mot dem.
For å se indeksen på et bord, bruk kommandoen nedenfor:
SHOW INDEX from {dbName.tableName};
Så, for vårt ansatt / avdelingseksempel, hadde vi lagt til avdeling i ansatt som UTENLANDSK Nøkkel fra avdelingstabellen.
La oss se de opprettet indeksene i tabeller for ansatte og avdelinger.
USE my_sql_foreign_key; SHOW INDEX from employee;
Bord | Ikke-unik | Nøkkelnavn | Seq_in_index | Kolonne_navn | Sortering | Kardinalitet | Underdel | Pakket | Null | Indeks_type |
---|---|---|---|---|---|---|---|---|---|---|
ansatt | 0 | HOVED | 1 | id | TIL | 0 | NULL | NULL | BTREE | |
ansatt | 1 | depIdFk | 1 | avd | TIL | 0 | NULL | NULL | JA | BTREE |
Du kan se to indekser - en er den primære nøkkelen for medarbeidertabellen og en annen er for UTENLANDSK Nøkkelavdeling som det er referert til fra avdelingstabellen.
SHOW INDEX from department;
Bord | Ikke-unik | Nøkkelnavn | Seq_in_index | Kolonne_navn | Sortering | Kardinalitet | Underdel | Pakket | Null | Indeks_type |
---|---|---|---|---|---|---|---|---|---|---|
avdeling | 0 | HOVED | 1 | avdelingId | TIL | 0 | NULL | NULL | BTREE |
Her kan du se at for avdelingstabellen har vi bare 1 indeks for primærnøkkel (som refereres til UTENLANDSK Nøkkel i medarbeidertabellen).
Sp # 7) Kan UTLANDSNØKKEL være NULL i MySQL?
Svar: Ja, det er helt ok å ha NULL for kolonnen som har UTENLANDSK Nøkkelavhengighet på et annet bord. Dette henviser også til det faktum at NULL ikke er en reell verdi, og derfor blir den ikke matchet / sammenlignet med verdier i foreldretabellen.
Konklusjon
I denne veiledningen lærte vi om forskjellige konsepter relatert til bruk av UTENLANDSKE TASTER i MySQL-databaser.
UTENLANDSK TAST letter opp oppdateringene og slettingen med passende begrensninger, men noen ganger kan mange slike forhold gjøre hele prosessen med innsetting og / eller sletting ganske tungvint.
Vi lærte hvordan vi lager UTENLANDSKE NØKLER og hvordan vi kan oppdatere og slippe en eksisterende UTENLANDSK Nøkkel fra underordnet tabell. Vi lærte også om forskjellige referanseintegritetshandlinger og hvordan vi kan oppnå forskjellig oppførsel ved hjelp av de forskjellige tilgjengelige alternativene som CASCADE, NO ACTION, SET NULL, etc.
Anbefalt lesing
- MySQL Lag tabellveiledning med eksempler
- MySQL Sett inn i tabellen - Sett inn uttalelsessyntaks og eksempler
- MySQL Lag visningsveiledning med kodeeksempler
- MySQL CONCAT og GROUP_CONCAT funksjoner med eksempler
- MySQL-transaksjonsveiledning med programmeringseksempler
- MySQL UNION - Omfattende opplæring med fageksempler
- Hvordan laste ned MySQL for Windows og Mac
- Forskjellen mellom SQL Vs MySQL Vs SQL Server (med eksempler)