IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 MySQL Discussion :

Déclencheur MySql UPDATE


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 84
    Par défaut Déclencheur MySql UPDATE
    Bonjour ,

    j'ai une table avec un champ "id", "valeur", "min", "max" et "alerte".
    Les champs min et max peuvent être à null.

    Je souhaiterai que lors d'un update du champ valeur, si celui si est inférieur à min et inversement pour max, le champ alerte passe à 1.
    Je ne veux pas que la valeur d'alerte change si cette dernière était sensée être à 1.

    J'ai actuellement fait un trigger tel que ci dessous (cas valeur min):

    BEFORE UPDATE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    BEGIN
       IF OLD.min != null THEN
            IF OLD.valeur >= min AND NEW.valeur <= min THEN
               	SET NEW.alerte = 1;
            END IF;
        END IF;
    END
    Lors ce que j'update une ligne, avec une valeur inférieur à min, la valeur d'alerte ne change pas.

    Quelqu'un pourrait me dire d'où vient mon erreur ?

  2. #2
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 921
    Par défaut
    Salut Robin52.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    create table `test`
    (  `id`      integer  unsigned not null auto_increment primary key,
       `valeur`  integer  unsigned not null,
       `mini`    integer  unsigned     null default null,
       `maxi`    integer  unsigned     null default null,
       `alerte`  char(01)          not null default 'N'
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    DROP TRIGGER IF EXISTS `verify1`
    --------------
     
    --------------
    CREATE TRIGGER `verify1`
    BEFORE INSERT ON `test`
    FOR EACH ROW
    BEGIN
      SET NEW.alerte = case when NEW.valeur < NEW.mini THEN 'O'
                            when NEW.valeur > NEW.maxi THEN 'O'
                                                       ELSE 'N' end;
    END
    --------------
     
    --------------
    DROP TRIGGER IF EXISTS `verify2`
    --------------
     
    --------------
    CREATE TRIGGER `verify2`
    BEFORE UPDATE ON `test`
    FOR EACH ROW
    BEGIN
      SET NEW.alerte = case when NEW.valeur < OLD.mini THEN 'O'
                            when NEW.valeur > OLD.maxi THEN 'O'
                                                       ELSE OLD.alerte end;
    END
    --------------
     
    --------------
    insert into `test` (`valeur`) values  (15),(25)
    --------------
     
    --------------
    insert into `test` (`valeur`,`mini`,`maxi`) values
      (45, 12,  65),
      (75, 55, 109),
      (17, 53,  66),
      (89, 53,  66)
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+--------+------+------+--------+
    | id | valeur | mini | maxi | alerte |
    +----+--------+------+------+--------+
    |  1 |     15 | NULL | NULL | N      |
    |  2 |     25 | NULL | NULL | N      |
    |  3 |     45 |   12 |   65 | N      |
    |  4 |     75 |   55 |  109 | N      |
    |  5 |     17 |   53 |   66 | O      |
    |  6 |     89 |   53 |   66 | O      |
    +----+--------+------+------+--------+
    --------------
    update `test` set `valeur` = 33 where id =1
    --------------
     
    --------------
    update `test` set `valeur` =  7 where id =3
    --------------
     
    --------------
    update `test` set `valeur` = 60 where id =5
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+--------+------+------+--------+
    | id | valeur | mini | maxi | alerte |
    +----+--------+------+------+--------+
    |  1 |     33 | NULL | NULL | N      |
    |  2 |     25 | NULL | NULL | N      |
    |  3 |      7 |   12 |   65 | O      |
    |  4 |     75 |   55 |  109 | N      |
    |  5 |     60 |   53 |   66 | O      |
    |  6 |     89 |   53 |   66 | O      |
    +----+--------+------+------+--------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    Dans cette façon de faire, il y a un problème.
    Si la valeur de min ou de max vient à être changée, le test ne fonctionne plus.

    @+

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 84
    Par défaut
    Il semble que les old.min et old.max ne marchent pas pour former mes conditions, je suis obligé d'utiliser le new.

    J'ai utilisé le case pour mettre toutes mes conditions, ça marche nickel

    Merci de ton aide

  4. #4
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 921
    Par défaut
    Salut robin52.

    Citation Envoyé par robin52
    Il semble que les old.min et old.max ne marchent pas pour former mes conditions, je suis obligé d'utiliser le new.
    Le OLD et le NEW s'écrivent en majuscule.

    Sur un DELETE, on utilise que le OLD (la ligne existe déjà).
    Sur un INSERT, on utilise que le NEW (la ligne n'existe pas encore).
    Sur un UPDATE, on utilise le OLD car le ligne existe déjà et le NEW car on vient modifier la ligne.

    Si l'on tient compte de la remarque précédente, on peut modifier le déclencheur ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    DELIMITER $$
    DROP TRIGGER IF EXISTS `verify1`$$
     
    CREATE TRIGGER `verify1`
    BEFORE UPDATE ON `test`
    FOR EACH ROW
    BEGIN
      DECLARE _mini  integer unsigned DEFAULT NULL;
      DECLARE _maxi  integer unsigned DEFAULT NULL;
     
      SET _mini = case when OLD.mini <> NEW.mini THEN NEW.mini ELSE OLD.mini end;
      SET _maxi = case when OLD.maxi <> NEW.maxi THEN NEW.maxi ELSE OLD.maxi end;
     
      SET NEW.alerte = case when NEW.valeur < _mini THEN 'O'
                            when NEW.valeur > _maxi THEN 'O'
                                                    ELSE OLD.alerte end;
    END$$
    DELIMITER ;
    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. MySQL - Update et insert Multiple
    Par mastronic dans le forum Requêtes
    Réponses: 1
    Dernier message: 22/08/2006, 09h28
  2. Mysql update supprime un enregistrement
    Par Langly dans le forum Requêtes
    Réponses: 5
    Dernier message: 03/08/2006, 17h46
  3. [MySQL] updater un seul tuple a la fois+increment de la cle
    Par kenny49 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 03/07/2006, 12h13
  4. [MySQL] update a partir du resultat d'un select
    Par brice01 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 05/04/2006, 22h44
  5. prob. d' incrémentation /mysql UPDATE
    Par K4trix dans le forum Requêtes
    Réponses: 15
    Dernier message: 01/12/2005, 17h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo