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

SQL Procédural MySQL Discussion :

Trigger Before Insert et Before Update


Sujet :

SQL Procédural MySQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 30
    Points : 31
    Points
    31
    Par défaut Trigger Before Insert et Before Update
    Bonjour,

    Je suis actuellement confronté à un phénomène inattendu en utilisant les triggers avec une table de test sous MySQL 5.0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TABLE test_trigger (
     id int unsigned not null auto_increment,
     code varchar(30) not null,
     date_creation timestamp not null,
     date_maj timestamp not null,
     PRIMARY KEY(id),
     KEY(code)
    ) ;
    Je crée deux triggers très simples permettant les mise à jour des champs date sur l'insertion et la mise à jour de l'enregistrement.

    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
     
    DELIMITER //
    CREATE TRIGGER d_bi_test_trigger BEFORE INSERT ON test_trigger FOR EACH ROW
    BEGIN
      SET new.date_creation = Now() ;
      SET new.date_maj = Now() ;
    END //
    DELIMITER ;
     
    DELIMITER //
    CREATE TRIGGER d_bu_test_trigger BEFORE UPDATE ON test_trigger FOR EACH ROW
    BEGIN
      SET new.date_maj = Now() ;
    END //
    DELIMITER ;
    Ensuite, j'exécute une insertion.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO test_trigger(code) VALUES ('Objet1') ;
    Le résultat est conforme à ce qui est attendu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    +----+--------+---------------------+---------------------+
    | id | code   | date_creation       | date_maj            |
    +----+--------+---------------------+---------------------+
    |  1 | Objet1 | 2007-08-13 11:34:54 | 2007-08-13 11:34:54 |
    +----+--------+---------------------+---------------------+
    Ensuite, je fais une mise à jour de cet enregistrement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE test_trigger SET code='Objet2' WHERE code='Objet1' ;
    Et le résultat est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    +----+--------+---------------------+---------------------+
    | id | code   | date_creation       | date_maj            |
    +----+--------+---------------------+---------------------+
    |  1 | Objet2 | 2007-08-13 11:35:25 | 2007-08-13 11:35:25 |
    +----+--------+---------------------+---------------------+
    En résumé mon déclencheur sur l'update semble avoir effectué les mêmes actions que mon déclencher sur l'insert, c'est-à-dire la maj de la "date de maj" et de la "date_creation"

    Etonnant, non ?

    Merci d'avance pour vos avis éclairés...

  2. #2
    Membre averti Avatar de jota5450
    Inscrit en
    Janvier 2006
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Janvier 2006
    Messages : 263
    Points : 332
    Points
    332
    Par défaut
    slt...

    j´ai une solution, mais....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TABLE test.test_trigger (
     id int UNSIGNED NOT NULL AUTO_INCREMENT,
     code varchar(30) NOT NULL,
     date_creation datetime ,
     date_maj datetime ,
     PRIMARY KEY(id),
     KEY(code)
    ) ;
    au lieu de timestamp, mais datetime....



    mais j´arrive pas a comprendre pourquoi ca marche pas avec timestamp...

    si quelqun d´autre a une idee.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 30
    Points : 31
    Points
    31
    Par défaut
    Cela me semble effectivement une bonne idée d'être allé rechercher de ce côté. On dirait que le timestamp possède un statut plus que particulier.

    On a un article intéressant qui traite de ce sujet :

    Two auto-TIMESTAMP columns in one table with MySQL 5.0

    Je vais essayer de l'exploiter et de voir ce que cela change sur mon modèle initial.

  4. #4
    Membre confirmé Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Points : 570
    Points
    570
    Par défaut
    Je crois que les colonnes de type timestamp se mettent à jour automatiquement, du moins la première par défaut. Pour plus d'infos, voici la doc MySQL sur le type timestamp : date-time
    "Dieu reste muet, si seulement nous pouvions convaincre l'être humain d'en faire autant."

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 30
    Points : 31
    Points
    31
    Par défaut Travail
    J'ai donc adapté à mon exemple la méthode proposée dans l'article que j'ai cité plus haut. Cela donne :

    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
     
    CREATE TABLE test_trigger (
     id int UNSIGNED NOT NULL AUTO_INCREMENT,
     code varchar(30) NOT NULL,
     date_creation timestamp NULL DEFAULT NULL,
     date_maj timestamp NULL DEFAULT NULL,
     PRIMARY KEY(id),
     KEY(code)
    ) ;
     
    DELIMITER //
    CREATE TRIGGER d_bi_test_trigger BEFORE INSERT ON test_trigger FOR EACH ROW
    BEGIN
      SET NEW.date_creation = IFNULL(NEW.date_creation,NOW()) ;
      SET NEW.date_maj = IFNULL(NEW.date_maj, '0000-00-00 00:00:00');
    END //
    DELIMITER ;
     
    DELIMITER //
    CREATE TRIGGER d_bu_test_trigger BEFORE UPDATE ON test_trigger FOR EACH ROW
    BEGIN
      SET NEW.date_maj = IF(NEW.date_maj = OLD.date_maj OR NEW.date_maj IS NULL, NOW(), NEW.date_maj);
      SET NEW.date_creation = IFNULL(NEW.date_creation, OLD.date_creation);
    END //
    DELIMITER ;
    On obtient bien au final après une insertion puis une mise à jour deux dates différentes bien qu'on ait choisi le format timestamp.

    Néanmoins, cette méthode ne brille pas par sa simplicité et on préférera donc l'utilisation des datetime à moins que l'on n'ait absolument besoin des timestamp.

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

Discussions similaires

  1. [10g] Trigger before insert
    Par Lung dans le forum Oracle
    Réponses: 6
    Dernier message: 21/12/2007, 16h22
  2. Trigger : Before insert
    Par guitou0 dans le forum Développement
    Réponses: 6
    Dernier message: 29/06/2007, 11h39
  3. Trigger d'insertion et d'update
    Par Shiva dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 01/01/2007, 14h32
  4. Trigger Before Insert
    Par Fred_ET dans le forum Administration
    Réponses: 7
    Dernier message: 22/11/2006, 00h29
  5. Créer un trigger "before insert" avec SQL Server
    Par bubi dans le forum Développement
    Réponses: 2
    Dernier message: 14/11/2005, 10h12

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