För en relationsdatabas som PostgreSQL kan det allmänt anses vara synd bland utvecklare inte att inkludera en primärnyckel i varje tabell. Det är därför avgörande att du gör ditt yttersta för att lägga till den där viktiga primärnyckelkolumnen till varje tabell, och tack och lov erbjuder Postgres två metoder för att utföra denna uppgift.
Använda seriell datatyp
Den överlägset enklaste och vanligaste tekniken för att lägga till en primärnyckel i Postgres är att använda SERIAL
eller BIGSERIAL
datatyper när CREATING
ett nytt bord. Som anges i den officiella dokumentationen, SERIAL
är inte en sann datatyp, utan är helt enkelt stenografisk notation som talar om för Postgres att skapa en automatiskt inkrementerad, unik identifierare för den angivna kolumnen.
Nedan skapar vi våra enkla books
tabell med en lämplig SERIAL
datatyp för primärnyckeln.
CREATE TABLE books (
id SERIAL PRIMARY KEY,
title VARCHAR(100) NOT NULL,
primary_author VARCHAR(100) NULL
);
Genom att helt enkelt ställa in vårt id
kolumnen som SERIAL
med PRIMARY KEY
bifogat kommer Postgres att hantera allt komplicerat arbete bakom kulisserna och automatiskt öka vårt id
kolumn med ett unikt primärnyckelvärde för varje INSERT
.
Använda en anpassad sekvens
I vissa sällsynta fall är standardinkrementella karaktär inbyggd i SERIAL
och BIGSERIAL
datatyper kanske inte passar dina behov. I dessa fall kan du utföra samma automatiskt inkrementerade primärnyckelfunktion för din kolumn genom att skapa en anpassad SEQUENCE
, liknande metoden som används i äldre version av Oracle.
Vi kanske är särskilt förtjusta i jämna tal men har också en stark avsky för allt som är mindre än 100, så vi vill bara att vår primära nyckel ska ökas med två från 100 för varje insättning. Detta kan åstadkommas med en anpassad SEQUENCE
som så:
CREATE SEQUENCE books_sequence
start 2
increment 2;
Nu när vi INSERT
en ny post i våra books
tabell, måste vi utvärdera nästa värde i vår sekvens med nextval('books_sequence')
och använd det som vårt id
.
INSERT INTO books
(id, title, primary_author)
VALUES
(nextval('books_sequence'), 'The Hobbit', 'Tolkien');
SEQUENCE
kan kryddas ännu mer om så önskas, med alternativ som minvalue
och maxvalue
för att naturligtvis indikera extrema värden, och till och med CYCLE
, vilket gör att sekvensen "loopar runt" när den når maxvalue
, tillbaka till start
värde och börja klättringen igen. Mycket mer information finns i den officiella dokumentationen.