Ludovic ROLAND

Blog technique sur mes expériences de développeur.

MySQL : Pallier l’absence de « CHECK »

18 mars 2012

Comme promis, voici un nouvel article qui cette fois se veut technique !

Au cours de ce billet, nous allons voir comment pallier l’absence de la directive CHECK dans MySQL dans un cas bien précis.

Le problème

Sous Oracle, il est possible d’indiquer qu’un champ d’une table doit être par exemple stocké en majuscule et ce directement dans le script de création de la table.

Par exemple, dans le script suivant, peu importe la casse d’origine, le nom de l’élève sera systématiquement stocké en majuscule :

CREATE TABLE `eleve` (
  `id` INT(11),
  `nom` VARCHAR(255) CHECK (`nom` = UPPER(`nom`)),
  PRIMARY KEY(`id`)
);

Oui, mais voilà, si MySQL ne détecte aucune erreur lors de la soumission du script, il ne prendra jamais en compte le fameux CHECK.

La solution

Une solution (parmi d’autres, j’en suis sûr) est d’utiliser les triggers.

Qu’est-ce qu’un trigger ?

Un trigger (ou déclencheur en français)  est une petite fonction qui s’exécute en fonction des actions qui se déroulent sur la base de données (insertion, mise à jour, suppression, etc.).

Dans notre cas, il faudra utiliser deux triggers pour que le nom de l’élève soit automatiquement mis en majuscule :

  • Un premier lors de l’insertion d’un nouvel élève ;
  • Une seconde lors de la mise à jour d’un élève.

Insertion de l’élève

Le but est ici de mettre à jour la donnée avant qu’elle ne soit insérée dans la base de données. Voici ce que ça donne :

DELIMITER //
CREATE TRIGGER `nom_insert` BEFORE INSERT ON `eleve`
 FOR EACH ROW BEGIN
   SET NEW.nom = UPPER(NEW.nom);
END
//

Bien évidemment, le faire après l’insertion n’est pas impossible, mais c’est déjà plus compliqué puisqu’il faut récupérer l’identifiant de la dernière entrée dans la base de données et jongler entre les nouvelles valeurs (NEW) et les anciennes (OLD) du camps concernés.

Mise à jour de l’élève

Le principe est exactement le même, sauf qu’ici nous allons changer le moment où le trigger doit se déclencher.

En effet, le trigger ne doit plus se déclencher avant une insertion, mais avant une mise à jour.

Voici alors ce que nous obtenons :

DELIMITER //
CREATE TRIGGER `nom_update` BEFORE UPDATE ON `eleve`
 FOR EACH ROW BEGIN
   SET NEW.nom = UPPER(NEW.nom);
END
//

Voilà, vous savez maintenant pallier l’absence du CHECK dans MySQL :)

Commentaires