Clés primaires et étrangères : mettre en place ses contraintes d'intégrité

L'intérêt des SGBD au-delà du stockage, est d'organiser ce stockage et permettre d'établir certaines règles sur celui-ci.
Ainsi, on définit généralement, pour chacune des tables, une clé primaire. Cette clé permettra d'identifier de manière unique le tuple dans la table (symboliser par une ligne lors de la représentation dans un tableau).
C'est pourquoi, lors de la déclaration d'une colonne (ou de l'association de plusieurs colonnes) comme clé primaire, Oracle crée automatiquement un index avec une contrainte d'unicité dessus.


La création d'une clé primaire peut se faire à la création de la table :

create table personne (id_personne primary key, nom, prenom, d_naissance, num_secu, nationnalite)


Mais dans ce cas, le nom de la contrainte est gérée par Oracle, si l'on veut nommer cette clé primaire (PK pour primary key), on peut l'expliciter :

create table personne (id_personne, nom, prenom, d_naissance, num_secu, nationnalite,
constraint pk_id(id_personne));



Une PK peut également être créée dans un second temps via un ordre alter sur la table :

create table personne (id_personne, nom, prenom, d_naissance, num_secu, nationnalite);
alter table personne add constraint pk_id primary key (id);


Cette clé primaire sera l'identifiant absolu pour l'application (Oracle lui, peut s'en passer grâce au rowid), c'est pourquoi la nécessité de la présence d'une clé primaire n'existe pas techniquement mais n'a pas grand sens applicativement.
Cette clé primaire permettra également dans un grand nombre de cas d'établir des contraintes d'intégrité, c'est à dire la gestion de certaines données dans une table par rapport à d'autres données appartenant à d'autres tables.
Par exemple, dans une base de données de gestion des clients on interdira la présence d'une facture (table facture) sans au moins une commande (table commande).
Dans ce cas, on crée alors une clé étrangère sur la table facture qui sera contraint à l'existence de la clé primaire de la table commande.

De la même manière que pour une PK, une contrainte de clé étrangère (FK pour foreign key) peut être définie à la création de la table ou dans un second temps :

create table t2 (col21, col22, col23, col24
constraint pk_t2 primary key (col21),
constraint fk_t2_t1 foreign key (col22) references t1(pk_t1 )
)

alter table t2 add constraint fk_t2_t1 foreign key (col22) references (pk_t1);


Gràce au mécanisme des clés mis en place et leurs index associés (à créer pour les FK), l'interrogation des tables sera facilitée lors des jointures.

Outre les contraintes de clés primaires ou étrangères, il existe d'autres contraintes,
par exemple, une contrainte d'unicité autre que celle correspondant à la clé primaire (une seule clé primaire par table est permise) ; pour celà, il faut créer un index unique :

create unique index num_sécu on personne;

Une autre possibilité de contrainte est la contrainte check qui permet généralement de spécifier une plage ou un format de valeur.

valeur positive sur consommation :
alter table voiture add constraint chk_pos check (consommation > 0);

valeur de choix sur la civilité (équivalent à ENUM sur certains autres SGBD) :
table personne add constraint chk_choix check (civilite in ('M.', 'Mme', 'Melle'));

valeur stockée en majuscule :
alter table personne add constraint chk_maj (nom = upper(nom));

Oracle permet ainsi de créer des contraintes d'intégrité de toutes sortes, il est cependant possible, une fois la contrainte créée, de gérer la notion d'actif/inactif. Une contrainte inactive aura ainsi aucune influence lors du fonctionnement de la base (insert, delete, ...). Cependant, le temps consommé par la réactivation de la contrainte peut être long selon les traitements à effectuer pour valider cette contrainte. Mais il est couramment intéressant de désactiver les contraintes.
Une contrainte se désactive de la manière suivante :

ALTER TABLE ma_table DISABLE CONSTRAINT ma_constraint;

et se réactive :

ALTER TABLE ma_table ENABLE CONSTRAINT ma_constraint;

Il faut évidemment noté que toute contrainte (activée) appliquée à la base nécessite un traitement supplémentaire lors d'insertions, de modifications ou de suppressions. Ces traitements ont tendance à ralentir l'utilisation de la base, il faut donc les utiliser avec parcimonie, l'article d'automatisation des désactivations de contraintes lors de grosses opérations (injection / suppression en masse) permet de limiter ces problèmes.


Voir également la création des index (utiles sur les clés étrangères, ceux sur les clé primaires sont créés automatiquement) et l'écriture des jointures.




Vous n'avez pas trouver réponse à votre question ? Préciser votre recherche :

Catégories