CREATE TABLE nasjonalitet( tegn varchar(3) not null, land varchar(20), PRIMARY KEY (tegn) ); CREATE TABLE skiloper( fisid int not null, navn varchar(50) not null, fodt date not null, nasjon varchar(3), PRIMARY KEY (fisid), FOREIGN KEY (nasjon) references nasjonalitet( tegn ) ); CREATE TABLE lop( lopnr int not null, loptype varchar(40), lopstart date, PRIMARY KEY (lopnr) ); CREATE TABLE resultat( lopnr int, lopernr int, plassering int, PRIMARY KEY (lopnr,lopernr), FOREIGN KEY (lopnr) references lop (lopnr), FOREIGN KEY (lopernr) references skiloper (fisid); );Forklaring:
Her har jeg laget 4 tabeller som inneholder både
primærnøkler og fremmednøkler.
Det som er viktig når man skal lage en gruppe tabeller
som har relasjoner til hverandre, er rekkefølgen man
oppretter tabellene i, hvilken rekkefølge man legger
inn data i og hvilken rekkefølge man sletter data og
tabeller i.
En sikker vinner er å slette data og tabeller i omvendt
rekkefølge som når man opprettet dem.
Problemet med rekkefølgen nemlig, er at man ikke kan lage
en fremmednøkkel som refererer til en tabell som ikke finnes.
Man kan heller ikke legge inn data som peker til data som
ikke finnes ennå. Dvs at man ikke kan kjøre
INSERT INTO skiloper values(1, 'Vegard Ulvang', '12.10.1956', 'N');
før man har kjørt
INSERT INTO nasjonalitet values('N', 'Norge');
Det betyr også at man heller ikke kan slette data som peker til
data andre steder,
dvs at man ikke kan slette 'Norge' i nasjonalitet-tabellen før man
sletter 'Vegard Ulvang' fra skiloper-tabellen.
Selv om man gjør som forklart over, kan man få problemer på noen systemer(men ikke Oracle) eller ved sirkulære avhengigheter. Da må man definere tabeller først med bare primærnøker. Etter det må man navngi constraints og legge inn fremmednøklene. Hvis man alltid følger denne prosedyren, vil man unngå constraint errors.
Eksempel:CREATE TABLE skiloper( fisid int not null, navn varchar(50) not null, fodt date not null, nasjon varchar(3), PRIMARY KEY (fisid) ); CREATE TABLE nasjonalitet( tegn varchar(3) not null, land varchar(20), PRIMARY KEY (tegn) ); CREATE TABLE lop( lopnr int not null, loptype varchar(40), lopstart date, PRIMARY KEY (lopnr) ); CREATE TABLE resultat( lopnr int, lopernr int, plassering int, PRIMARY KEY (lopnr,lopernr) ); ALTER TABLE skiloper( ADD CONSTRAINT fk_Skiloper2Nasjon FOREIGN KEY (nasjon) references nasjonalitet(tegn) ); ALTER TABLE resultat( ADD CONSTRAINT fk_Resultat2LopLoper FOREIGN KEY (lopnr) references lop (lopnr) FOREIGN KEY (lopernr) references skiloper (fisid) );