Blog technique sur mes expériences de développeur.
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.
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.
Une solution (parmi d’autres, j’en suis sûr) est d’utiliser les triggers.
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 :
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.
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 :)