3.3. Clés secondaires

Souvenez-vous des tables temps et villes du Chapitre 2. Considérez le problème suivant : vous voulez vous assurer que personne n'insère de lignes dans la table temps qui ne correspondraient pas à une entrée dans la table villes. Ceci maintient l'intégrité référentielle de vos données. Dans les systèmes de bases de données simples, ceci serait implémenté (si possible) en vérifiant en premier lieu que la table villes dispose bien d'un enregistrement correspondant, puis en insérant ou en empêchant l'insertion du nouvel enregistrement dans temps. Cette approche présente un certain nombre de problèmes et n'est pas très pratique, donc PostgreSQL peut s'en charger pour vous.

La nouvelle déclaration des tables ressemblerait à ceci :

CREATE TABLE villes (
	ville       varchar(80) primary key,
	emplacement point
);

CREATE TABLE temps (
	ville      varchar(80) references villes,
	temp_haute int,
	temp_basse int,
	prcp       real,
	date       date
);

Maintenant, essayons d'insérer un enregistrement non valide :

INSERT INTO temps VALUES ('Berkeley', 45, 53, 0.0, '1994-11-28');

ERROR:  insert or update on table "temps" violates foreign key constraint "temps_ville_fkey"
DETAIL:  Key (ville)=(Berkeley) is not present in table "villes".

Le comportement des clés secondaires peut être précisé très finement pour votre application. Nous n'irons pas plus loin que cet exemple simple dans ce tutoriel mais référez-vous simplement au Chapitre 5 pour plus d'informations. Utiliser correctement les clés secondaires améliore la qualité de vos applications de bases de données, donc vous êtes fortement encouragé à les connaître.