TD 6 : Contraintes
Définition de données Contraintes
L3 MIASHS/Ingémath |
Année 2024 |
Contraintes SQL
Contraintes CHECK.
Cette contrainte permet de vérifier que les colonnes d’une ligne donnée vérifient une certaine condition. Par exemple, on pourrait vouloir vérifier que la valeur de la colonne percentage
de la table countrylanguage
est inférieure à 100 ou que la valeur de la colonne return_date
de la table rental
est soit NULL
ou supérieure à rental_date
. Ces contraintes se définissent lors de la création de la table. Par exemple :
CREATE TABLE solde(
produit TEXT,INT,
reduc_pourcentage CHECK (reduc_pourcentage<=100 AND reduc_pourcentage%10=0)
);
On peut ajouter une contrainte CHECK à une table qui existe déjà. Par exemple :
ALTER TABLE solde ADD
CHECK (reduc_pourcentage >=0);
ou bien en nommant la contrainte :
ALTER TABLE solde
ADD CONSTRAINT reduc_positive
CHECK (reduc_pourcentage >=0);
Contraintes DEFAULT / NOT NULL / UNIQUE
Ces contraintes s’appliquent à une colonne en particulier. La contrainte DEFAULT
spécifie une valeur par défaut pour remplir une colonne lorsque sa valeur n’est pas spécifiée, NOT NULL
que la valeur de la colonne ne peut pas être NULL
et UNIQUE
que deux lignes différentes de la table ne peuvent pas avoir la même valeur sur les colonnes indiquées. Par exemple:
CREATE TABLE membre(
VARCHAR(50) NOT NULL,
nom VARCHAR(50) NOT NULL,
prenom DATE DEFAULT NOW(),
date_inscription UNIQUE(nom, prenom)
);
Contraintes PRIMARY/FOREIGN KEY
.
Formellement, la contrainte PRIMARY KEY
est équivalente à UNIQUE
et NOT NULL
. C’est un moyen d’identifier de façon unique chaque ligne. Chaque table est censée avoir une clé primaire. La contrainte FOREIGN KEY
spécifie que la valeur d’une (ou de plusieurs) colonne contient des valeurs présentes dans une autre table. Par exemple, la colonne capital
de country
contient une valeur qui doit apparaître dans la colonne id
de city
. Par exemple:
CREATE TABLE membre(
VARCHAR(50) NOT NULL,
nom VARCHAR(50) NOT NULL,
prenom id INT,
PRIMARY KEY (id)
);
CREATE TABLE amis(
INT,
id1 INT,
id2 FOREIGN KEY (id1) REFERENCES membre (id)
);
On peut aussi ajouter une seconde clef étrangère comme ceci :
ALTER TABLE amis ADD
FOREIGN KEY (id2) REFERENCES membre;
Contraintes EXCLUDE.
Les contraintes NOT NULL, DEFAULT, KEY, CHECK
portent uniquement sur une ligne tandis que la contrainte UNIQUE
permet uniquement de tester des égalités entre lignes. On veut parfois vérifier une condition plus riche sur deux lignes. Par exemple, si notre table contient des réservations d’une salle entre start_date
et end_date
, on ne veut pas que deux réservations se chevauchent. On écrira:
CREATE TABLE reservation(
DATE,
start_date DATE,
end_date
USING gist (
EXCLUDE WITH &&)
daterange(start_date, end_date) );
Exercices
On va travailler sur une copie du schéma world
. Il va donc falloir copier dans vos schémas les tables world.country
, world.city
et world.countrylanguage
.
CREATE TABLE chaprot.td_country (like world.country) ;
Va copier les champs avec leur type et les contraintes NOT NULL
. Mais aucune autre contrainte. Par contre, la commande :
CREATE TABLE chaprot.td_country (
like world.country
including all
) ;
va copier toutes les contraintes SAUF celles qui font référence à d’autres tables (clé étrangère, \(\ldots\)).
- Copier les trois tables de
world
dans votre schéma (chaprot
). - Remplir les tables avec les valeurs qui sont dans les tables originelles.
Recréer les contraintes qui n’ont pas été copiées pour obtenir des tables qui soient réellement identiques.
Vérifier que les résultats de
\d world.country
et
\d chaprot.td_country
sont bien égaux.
Ajouter la contrainte : La colonne countrycode
de chaprot.td_city
est une référence à la clé primaire de chaprot.td_country
.
Ajouter la contrainte : La colonne percentage
de chaprot.td_countrylanguage
contient un réel compris entre \(0\) et \(100\).
Ajouter la contrainte : Dans chaprot.td_countrylanguage
, il n’y a pas deux lignes qui parlent du même pays et de la même langue.
Ajouter la contrainte : Dans chaprot.td_country
, pour chaque pays, il n’existe pas un autre pays de la même region
qui n’est pas dans le même continent
, soit la dépendance fonctionnelle : region → continent