Primærnøkler og fremmednøkler

Eksempel:
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) );