Référencer une autre table

Les clefs primaires définies dans une table peuvent être référencées par une autres table avec la commande références.

Créons une table d’élèves dans une école:

create table eleves (id serial primary key, nom varchar(32), prenom varchar(32));
insert into eleves (nom, prenom) values('Sophie','Favier');
insert into eleves (nom, prenom) values('Jacques','Brel');
insert into eleves (nom, prenom) values('Jacques','Martin');
insert into eleves (nom, prenom) values('Pierre','Perret');
insert into eleves (nom, prenom) values('Mel','Gibson');
insert into eleves (nom, prenom) values('François','Hollande');
insert into eleves (nom, prenom) values('Jean Jacques','Goldman');
insert into eleves (nom, prenom) values('Donald','Trump');
insert into eleves (nom, prenom) values('Etienne','Martin');

Maintenant, créons une table des classes:

create table classes (id serial primary key, classe varchar(12));
insert into classes (classe) values ('Terminale');
insert into classes (classe) values ('Première');
insert into classes (classe) values ('Seconde');

Et enfin, rajoutons une colonne dans la table des élèves pour indiquer dans quelle classe se trouve l’élève:

alter table eleves add column classe int references classes;

Puis renseignons la classe pour chaque élève:

update eleves set classe = 1 where id = 4;
update eleves set classe = 2 where id = 5;
update eleves set classe = 3 where id = 6;
update eleves set classe = 1 where id = 7;
update eleves set classe = 2 where id = 8;
update eleves set classe = 3 where id = 9;
update eleves set classe = 1 where id = 10;
update eleves set classe = 2 where id = 11;
update eleves set classe = 3 where id = 12;

Il devient facile à partir de ce moment d’extraire les eleves d’une classe en particulier à l’aide, par exemple, d’une requête imbriquée:

tutorial=> select nom, prenom from eleves where classe in (select id from classes where classe = 'Terminale');
     nom      | prenom
--------------+---------
 Sophie       | Favier
 Pierre       | Perret
 Jean Jacques | Goldman
(3 rows)

tutorial=>

Ou d’une jointure entre les deux tables:

tutorial=> select eleves.nom, eleves.prenom, classes.classe from eleves,classes  where classes.classe = 'Terminale' and eleves.classe = classes.id;
     nom      | prenom  |  classe
--------------+---------+-----------
 Sophie       | Favier  | Terminale
 Pierre       | Perret  | Terminale
 Jean Jacques | Goldman | Terminale
(3 rows)

tutorial=>

index suite…