Les contraintes constituent une méthode pour assurer l’intégrité des données. Elles
garantissent la validité des valeurs saisies dans les colonnes et le maintien des relations entre
les tables. Elles se mettent en œuvre dans les instructions CREATE TABLE ou ALTER TABLE.
Les contraintes s’appliquent sur des colonnes ou sur des tables entières. Une contrainte de
colonne fait partie de la définition de la colonne et ne s’applique qu’à celle-ci.
Une contrainte de table est déclarée indépendamment de la définition d’une colonne et peut
s’appliquer à plusieurs colonnes d’une même table. Dès lors que la contrainte porte sur
plusieurs colonnes, elle doit être définie au niveau table.
64
Exemple 1 : Création de la table « Employe » pour laquelle :
· Les champs Matricule, Nom, Prénom, DateEntree ne peuvent être nuls
· La clé primaire est le champ Matricule, champ compteur dont la valeur initiale
est 1, et l’incrément de 1
· La colonne Nom ne peut contenir de doublons
CREATE TABLE Employe(
Matricule NUMERIC NOT NULL PRIMARY KEY,
Nom VARCHAR2(25) NOT NULL UNIQUE,
Prenom VARCHAR2 (15) NOT NULL,
Adresse VARCHAR (30) NULL,
Cp NUMERIC(5,0),
DateEntree DATE NOT NULL,
DateFin DATE NULL);
· Qu’on aurait pu coder :
CREATE TABLE Employe(
Matricule NUMERIC NOT NULL ,
Nom VARCHAR2(25) NOT NULL ,
Prenom VARCHAR2 (15) NOT NULL,
Adresse VARCHAR (30) NULL,
Cp NUMERIC(5,0),
DateEntree DATE NOT NULL,
DateFin DATE NULL,
CONSTRAINT PK_Employee PRIMARY KEY (Matricule),
CONSTRAINT UK_Employe UNIQUE (Nom) ) ;
· Pour une clé primaire constituée de 2 colonnes, on aurait forcément codé :
CREATE TABLE Employe(
65
Matricule NUMERIC NOT NULL ,
Nom VARCHAR2(25) NOT NULL ,
Prenom VARCHAR2 (15) NOT NULL,
Adresse VARCHAR (30) NULL,
Cp NUMERIC(5,0),
DateEntree DATE NOT NULL,
DateFin DATE NULL,
CONSTRAINT PK_matricule PRIMARY KEY (Nom, Prenom)) ;
Exemple 2 : Ajout d’une contrainte DEFAULT qui insère la valeur ‘*Inconnu*’ dans la colonne
du prénom, si aucun prénom n’a été saisi. La colonne doit être codée :
Prenom VARCHAR (15) NOT NULL DEFAULT ‘*Inconnu*’,
Cette contrainte ne s’applique qu’à l’insertion d’un enregistrement.
Exemple 3 : Ajout d’une contrainte CHECK qui assure que la date de résiliation du contrat est
bien postérieure à la date d’embauche.
ALTER TABLE Employe
ADD CONSTRAINT CK_ Employe CHECK (DateFin < DateEntree)
Une contrainte CHECK peut être créée avec n'importe quelle expression logique (booléenne)
qui retourne TRUE ou FALSE sur la base des opérateurs logiques. Pour contrôler qu’une
colonne salaire est comprise entre 1500 € et 10000 €, l'expression logique est la suivante :
Salaire >= 1500 AND salaire <= 10000
Pour s’assurer qu’une colonne Département est bien composée de 2 chiffres, l’expression
logique sera de type :
Dep like ('[0-9][0-9]')
Exemple 4 : Création de la table Client pour laquelle :
· Les champs CodeCli, Nom, CodeRep ne peuvent être nuls.
· La clé primaire est le champ CodeCli.
· La contrainte FOREIGN KEY, basé sur la colonne Coderep référence le champ CodeRep de
la table Représentant pour garantir que tout client est associé à un représentant existant.
CREATE TABLE Client
(CodeCli NUMERIC NOT NULL,
Nom VARCHAR2(25) NOT NULL,
Coderep NUMERIC NOT NULL,
CONSTRAINT PK_Codecli PRIMARY KEY (Codecli),
CONSTRAINT FK_Client_REPRESENTANT FOREIGN KEY (Coderep)
REFERENCES Representant (Coderep))
Pour pouvoir créer une telle relation au niveau du schéma de la base, il est nécessaire que la
colonne CODEREP soit clé primaire de la table REPRESENTANT.
66
Dans le cas d’une relation entre les tables Client et REPRESENTANT, le fait que l’intégrité
empêche de supprimer un représentant est plutôt une bonne chose : un représentant quittant
sa société, n’emmène pas tous ses clients avec lui…
Il n’en serait pas de même entre les tables Commandes et Detail_Commandes : En effet,
si un client souhaite annuler sa commande, il est important de supprimer au même moment,
tout le détail…
Il faut également protéger l’insertion de données dans la table Detail_Commandes, pour
que toute ligne détail ait une correspondance dans la table Commandes. Le choix effectué
dans les spécifications INSERT et UPDATE (supprimer une règle) dans les propriétés de la
relation entre ces deux tables garantit les règles de gestion imposées. La syntaxe SQL
correspondant aux options :
ALTER TABLE.Detail_Commandes
ADD
CONSTRAINT FK_Detail Commandes_Commandes FOREIGN KEY (NO_Cde)
REFERENCES Commandes (NO_Cde)
ON DELETE CASCADE ;
ON DELETE CASCADE : demande la suppression des lignes dépendantes dans la table en
cours de définition, si la ligne contenant la clé primaire correspondante dans la table maître
est supprimée. Si cette option n’est pas indiquée, la suppression sera impossible dans la table
maître s’il existe des lignes référençant cette valeur de clé primaire.
ON DELETE SET NULL : Demande de la mise à NULL des colonnes constituant la clé
étrangère qui font référence à la ligne supprimée. Si cette option n’est pas indiquée, la
suppression sera impossible dans la table maître s’il existe des lignes référençant cette valeur
de clé primaire.
[NOT] DEFERRABLE : Repousse ou nom [NOT] la vérification de la contrainte au moment de
la validation de la transaction.
Mnémonique associée au type de contrainte
Voici les mnémoniques associées au type de contrainte pour le nommage de celles-ci :
PK Clé primaire
UQ Unique
NN NOT NULL
CK Check
RF Références
FK Clé étrangère
67
Alimenter la base de données
Saisir des données dans vos tables
Pour saisir des données dans vos tables, nous allons vous présenter 3 méthodes. Nous
utiliserons le jeu d’essai suivant :