Les types numérqiues autorisés par MYSQL sont:
Code : Tout sélectionner
Type Octets De A
TINYINT 1 -128 127
SMALLINT 2 -32768 32767
MEDIUMINT 3 -8388608 8388607
INT 4 -2147483648 2147483647
BIGINT 8 -9223372036854775808 9223372036854775807
Pour ce qui est d'une plage numérique personnalisée celà s'appelle une contrainte ou règle de validité de champ ou rules en anglais.
Mysql (ver < à 5) n'intègre par de rules ou triggers automatiques comme on peut trouver sous Access, SQL Server ou Oracle. Mais on peut toujour utiliser des fonctions de validation écrites en PHP (comme l'a montré CYRANO)
Par contre pour utiliser Mysql pour le controle on doit utliser des procédures stockées ou des triggers. Mais pour ça il faut avoir au minimum un Mysql version 5.
Dans ton cas, une procédure doit contôler les entrées avant l'ajout et la mise à jour des champs concernés.
Dès l'ors, la validité d'une "valeur_à_entrer" dans un champ numérique par rapport à une plage numérique [valeur_min, valeur_max] peut être vérifiée comme suit :
Règle
Code : Tout sélectionner
IF valeur_à_entrer < valeur_min THEN valeur_à_entrer = valeur_min
ELSE
IF valeur_à_entrer > valeur_max THEN valeur_à_entrer = valeur_max
Ces deux tests sont sensés retourner la valeur valide à entrer .
Exemple :
La palge de validité : [100, 10000]
Pour la valeur entrée : 99
La règle retourne normalement 100
Pour la valeur entrée : 110
La règle retourne normalement 110
Pour la valeur entrée : 99999
La règle retourne normalement 10000
Voici un exemple de procédure d'ajout qui effectue ce type de contôle :
Contexte:
soit la procédure "ajout_dans_t1" qui doit ajouter des valeurs numériques dans la table t1 après avoir effectué un contrôle de validité.
Pour créer la procédure:
Code : Tout sélectionner
CREATE PROCEDURE `ajout_dans_t1`(IN p1 INT)
BEGIN
IF p1<100 THEN
SET p1=100;
ELSEIF p1>10000 THEN
SET p1=10000;
END IF;
INSERT INTO t1 (valeur1) VALUES (p1);
END
Pour effectuer l'ajout validé il suffit alors d'appeler cette procédure avec la commande :
CALL ajout_dans_t1 (valeur_à_entrer)
Dans ce cas, au lieu d'exécuter une requête INSERT directe sur la table t1, il suffit d'appeler la procédure qui s'occupe de la validation des entrées et de l'INSERT définitif.
Exemple :
CALL ajout_dans_t1 (99) > ajoute la valeur 100 dans la table t1 puisque 99 sera corrigée par le "IF" de la procédure appliqué avant "INSERT"
Une autre solution consiste à créer un TRIGGER qui observe les actions INSERT et qui effectue la validation avant d'appliquer l'insertion.
L'avantage du TRIGGER est qu'il est automatiquement exécuté lors d'un ordre INSERT normal (autrement dit, on n'a plus besoin d'appeler une procédure spéciale par un CALL)
Un tel TRIGGER s'écrit selon l'exemple précédent :
Code : Tout sélectionner
CREATE TRIGGER valider BEFORE INSERT ON t1
FOR EACH ROW
BEGIN
IF NEW.valeur1 < 100 THEN
SET NEW.valeur1 = 100;
ELSEIF NEW.valeur1 > 10000 THEN
SET NEW.valeur1 = 10000;
END IF;
END
où:
BEFORE INSERT ON t1 : désigne que le trigger est déclenché avant l'application de l'INSERT. Les valeurs à ajouter dans la table sont alors stockées temporairement dans une table système nommée "NEW"
NEW : désigne la table temporaire créée par le trigger pour gérer la transaction d'ajout.
NEW hérite de la structure de la requête INSERT et contient les champs et valeurs à entrer (celles qui se trouvent dans la clause VALUES de l'INSERT)
Dans cet exemple : NEW.valeur1 désigne alors la valeur à entrer dans le champ valeur1 de la table t1. Ce champ est traité par le trigger avant de confirmer l'ajout définitif.
Pour exécuter ce trigger il suffit de lancer une reqûete INSERT normale
Exemple : INSERT INTO t1 (valeur1) VALUES (99) > ajoute 100 dans valeur1 après l'intervention automatique et transparente du trigger.