Comment limiter la plage d'une colonne mysql?

bulma
Invité n'ayant pas de compte PHPfrance

30 sept. 2005, 11:52

Bonjour à tous,

J'aimerai savoir si il est possible de limiter une colonne dans Mysql. Par exemple de 100 à xxx ou de 100 à nolimit.

Merci beaucoup pour votre aide.
Bulma

Mammouth du PHP | 19672 Messages

30 sept. 2005, 11:54

De 100 quoi à xxx quoi au juste ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

30 sept. 2005, 12:00

de 100 à 10000 par exemple. Ca va ressembler à un truc comme BIGINT (100,10000) ???

Mammouth du PHP | 19672 Messages

30 sept. 2005, 12:03

On peut savoir de quoi vous parlez avant que je n'envoie ce sujet pour l'instant absolument sans intérêt dans la poubelle ? :evil:

Question claire => réponse claire;
Question floue => réponse hasardeuse ou pas de réponse du tout !
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

bulma
Invité n'ayant pas de compte PHPfrance

30 sept. 2005, 12:18

Désolé si cétait pas assez clair, je vais essayer d'être plus claire cette fois-ci.

J'aimerai créer une colonne dans une table Mysql qui me permettrai d'y stocker des nombres allant de 100 à 100000, donc si j'éssaye d'enregistrer la valeur 99 il enregistrera 100 vu qu'il est limité à 100 minium.

J'éspére que j'ai été claire dans l'explication de mon probléme.

Merci.

Mammouth du PHP | 19672 Messages

30 sept. 2005, 12:58

Tu peux traiter ces valeurs par programmation avant de les envoyer vers la base. Tu mets un champ en INT dans la table et pour le traitement, tu fais deux alternatives en PHP:
// Si la valeur est inférieure à 100, on met 100 par défaut;
$valeur = ($valeur < 100) ? 100 : $valeur;
// Si la valeur est supérieure à 100000 on met à 100000 par défaut.
$valeur = $valeur > 100000) ? 100000 : $valeur;
//... suite de l'enregistrement dans la base de donnée de la valeur.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

30 sept. 2005, 14:35

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.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

30 sept. 2005, 19:22

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 ....................
C'est un cours particulier la :lol:
Il vient d'où tout ce blabla qui a été copié/collé :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

03 oct. 2005, 11:44

....

C'est un cours particulier la :lol:
Il vient d'où tout ce blabla qui a été copié/collé :wink:
Je ne comprends pas ce genre d'intervention!
On passe des heures a concevoir une réponse qui peut intéresser les gens et finalement on reçoit de telle intervention plein la geulle.

Au sages d'en juger...
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 19672 Messages

03 oct. 2005, 12:04

Il vrai Truc que ton intervention était quelque peu indélicate, évite donc à l'avenir, merci.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

03 oct. 2005, 21:58

J'admet que c'était déplacé si c'est effectivement une "présentation" faite maison :wink:

surtout que c'est interessant =D>

sans rancune sadeq (il n'y avait pas de mauvais fond ) :merci:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute