Les contraintes en PostgreSQL

Introduction aux contraintes

Dans PostgreSQL, les contraintes représentent des règles spécifiques que l'on applique aux tables ou colonnes d'une base de données. Leur rôle est de garantir l'intégrité, la cohérence, et l'exactitude des données, tout en s'assurant de leur qualité et fiabilité. Ces règles de contraintes déterminent les limites relatives à l'insertion, la mise à jour et la suppression des données.

Les contraintes de vérification (Check Constraints)

Les contraintes de vérification imposent des conditions à respecter pour chaque ligne d'une table. Voici un exemple d'utilisation :

CREATE TABLE etudiants (
  student_id SERIAL PRIMARY KEY,
  age INT,
  -- Vérifie que l'âge est compris entre 18 et 45
  CONSTRAINT verification_age CHECK (age BETWEEN 18 AND 45)
);

Les contraintes de non-nullité (Not-Null Constraints)

Les contraintes de non-nullité empêchent une colonne d'avoir la valeur nulle. Voici comment on peut les mettre en œuvre :

CREATE TABLE etudiants (
  student_id SERIAL PRIMARY KEY,
  age INT NOT NULL,
  subject VARCHAR(100) NOT NULL
);

Les contraintes d'unicité (Unique Constraints)

Les contraintes d'unicité garantissent que chaque valeur d'une colonne est unique à travers toutes les lignes. Exemple :

CREATE TABLE aliments (
  food_id SERIAL PRIMARY KEY,
  nom_aliment VARCHAR(100) UNIQUE
);

Les clés primaires (Primary Keys)

Les clés primaires servent d'identifiant unique pour chaque ligne d'une table. Exemple d'implémentation :

CREATE TABLE aliments (
  food_id SERIAL PRIMARY KEY,
  nom_aliment VARCHAR(50),
  prix INT
);

Les clés étrangères (Foreign Keys)

Les clés étrangères relient les colonnes d'une table à celles d'une autre. Par exemple :

CREATE TABLE commandes (
  order_id SERIAL PRIMARY KEY,
  visiteur_restaurant_id INT,
  -- Lien vers la table 'visiteurs_restaurant'
  FOREIGN KEY (visiteur_restaurant_id) REFERENCES visiteurs_restaurant(visitor_id)
);

Les contraintes d'exclusion (Exclusion Constraints)

Les contraintes d'exclusion empêchent que deux lignes ne respectent au moins une condition simultanément, ce qui est crucial pour éviter le chevauchement de plages. Exemple :

CREATE TABLE reunions (
  meeting_id SERIAL PRIMARY KEY,
  start_time TIMESTAMP NOT NULL,
  end_time TIMESTAMP NOT NULL,
  -- Plage de temps (short for 'timestamp range')
  EXCLUDE USING GIST (tsrange(start_time, end_time) WITH <>)
);

Insertions réussies et échouées

Voici un exemple d'insertion réussie :

INSERT INTO reunions (start_time, end_time) VALUES  
  ('2024-05-24 09:00:00', '2024-05-24 11:30:00');

Et une insertion échouée :

INSERT INTO reunions (start_time, end_time) VALUES  
  ('2024-05-24 09:30:00', '2024-05-24 11:30:00');