For en relationel database som PostgreSQL kunne det i vid udstrækning betragtes som en synd blandt udviklere ikke at inkludere en primær nøgle i hver tabel. Det er derfor afgørende, at du gør dit yderste for at tilføje den altafgørende primærnøglekolonne til hver tabel, og heldigvis tilbyder Postgres to metoder til at udføre denne opgave.
Brug af seriel datatype
Langt den enkleste og mest almindelige teknik til at tilføje en primær nøgle i Postgres er ved at bruge SERIAL
eller BIGSERIAL
datatyper, når CREATING
et nyt bord. Som angivet i den officielle dokumentation, SERIAL
er ikke en sand datatype, men er blot en stenografi, der fortæller Postgres at oprette en automatisk inkrementeret, unik identifikator for den angivne kolonne.
Nedenfor laver vi vores simple books
tabel med en passende SERIAL
datatype for den primære nøgle.
CREATE TABLE books (
id SERIAL PRIMARY KEY,
title VARCHAR(100) NOT NULL,
primary_author VARCHAR(100) NULL
);
Ved blot at indstille vores id
kolonne som SERIAL
med PRIMARY KEY
vedhæftet, vil Postgres håndtere alt det komplicerede arbejde bag kulisserne og automatisk øge vores id
kolonne med en unik primær nøgleværdi for hver INSERT
.
Brug af en tilpasset sekvens
I nogle sjældne tilfælde er standard inkrementelle karakter indbygget i SERIAL
og BIGSERIAL
datatyper passer muligvis ikke til dine behov. I disse tilfælde kan du udføre den samme automatiske inkrementerede primærnøglefunktionalitet for din kolonne ved at oprette en tilpasset SEQUENCE
, svarende til metoden brugt i ældre version af Oracle.
Måske er vi særligt glade for lige tal, men vi har også en stærk afsky for alt, der er mindre end 100, så vi ønsker kun, at vores primære nøgle skal øges med to, der starter ved 100 for hver indsættelse. Dette kan opnås med en brugerdefineret SEQUENCE
sådan:
CREATE SEQUENCE books_sequence
start 2
increment 2;
Nu når vi INSERT
en ny rekord i vores books
tabel, skal vi evaluere den næste værdi af vores sekvens med nextval('books_sequence')
og brug det som vores id
.
INSERT INTO books
(id, title, primary_author)
VALUES
(nextval('books_sequence'), 'The Hobbit', 'Tolkien');
SEQUENCES
kan krydres endnu mere, hvis det ønskes, med muligheder som minvalue
og maxvalue
for selvfølgelig at angive ekstreme værdier, og endda CYCLE
, som tillader sekvensen at "loope rundt", når den når maxvalue
, vender tilbage til start
værdi og begynde stigningen forfra. Langt mere information kan findes i den officielle dokumentation.