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 :

Mon trigger ne fonctionne pas !


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    414
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2010
    Messages : 414
    Par défaut Mon trigger ne fonctionne pas !
    Bonjour
    J'essaie d'écrire les trigger mais j'obtiens cette erreur :
    Nom : Croquis.png
Affichages : 708
Taille : 445,5 Ko

    En fait :le Trigger qui va insérer une ligne dans la table date_utilisateur pour chaque ligne insérée dans la table utilisateur.

    Voici le trigger:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DELIMITER |
    
    CREATE TRIGGER trigger_utilisateur
    BEFORE INSERT ON utilisateur
    FOR EACH ROW
    BEGIN
    INSERT INTO date_utilisateur VALUES("", NOW());
    END |
    
    DELIMITER ;
    Voici la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE date_utilisateur(
            id              Int(20) Auto_Increment PRIMARY KEY,
            date_insertion  DATE
    )ENGINE=InnoDB DEFAULT CHARSET=utf8;
    Nom : Croquis0.png
Affichages : 626
Taille : 175,1 Ko

  2. #2
    Membre Expert

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 583
    Par défaut
    Salut,

    Le problème semble venir de l'insertion dans la table utilisateur, peut-on voir la requête? il semble que tu essais d'insérer '' dans id alors que c'est un integer?

  3. #3
    Membre éclairé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    414
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2010
    Messages : 414
    Par défaut
    Voici mes requetes que j'essai d'insérer et ça marque la meme erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO utilisateur(nom, prenom) VALUES('toto', 'tutu');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO utilisateur(id, nom, prenom) VALUES('', 'toto', 'tutu');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO utilisateur(id, nom, prenom) VALUES('toto', 'tutu');

  4. #4
    Membre Expert

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 583
    Par défaut
    Dans ta table date_utilisateur tu as un autoincremente de type entier et que ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO date_utilisateur VALUES("", NOW());
    E
    si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO date_utilisateur(date_insertion  ) VALUES(NOW());
    E
    ? De plus je pense que c'est l'id utilisateur qui vient d'être inséré que tu veux dans date_utilisateur en clé primaire?

  5. #5
    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 882
    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 882
    Par défaut
    Salut MInfo25.

    Si j'ai bien compris votre problème, vous cherchez à connaitre la date de création et la date de modification d'une ligne dans la table des utilisateurs.
    Il est inutile de créer un déclencheur pour ce que vous essayez de faire.

    Voici un exemple :
    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
    118
    119
    120
    121
    122
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    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 `mouchard`
    --------------
     
    --------------
    CREATE TABLE `mouchard`
    ( `id`           integer unsigned  NOT NULL auto_increment primary key,
      `lib`          CHAR(255)         NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    DROP TABLE IF EXISTS `utilisateur`
    --------------
     
    --------------
    CREATE TABLE `utilisateur`
    ( `id`           integer unsigned  NOT NULL auto_increment Primary Key,
      `nom`          CHAR(255)         NOT NULL,
      `prenom`       CHAR(255)         NOT NULL,
      `create_date`  TIMESTAMP(6)      DEFAULT current_timestamp(6),
      `update_date`  TIMESTAMP(6)      DEFAULT current_timestamp(6) ON UPDATE CURRENT_TIMESTAMP(6)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    DROP TRIGGER IF EXISTS `ajout`
    --------------
     
    --------------
    CREATE TRIGGER `ajout_1`
    AFTER INSERT ON `utilisateur`
    FOR EACH ROW
    BEGIN
      DECLARE _msg  varchar(255) DEFAULT NULL;
      set _msg = concat('id = ', new.id, ' nom = ', left(concat(new.nom, '          '),10), ' prenom = ', left(concat(new.prenom,'          '),10), ' date de création     = ', new.create_date);
      insert into `mouchard` (`lib`) values (_msg);
    END
    --------------
     
    --------------
    CREATE TRIGGER `ajout_2`
    AFTER UPDATE ON `utilisateur`
    FOR EACH ROW
    BEGIN
      DECLARE _msg  varchar(255) DEFAULT NULL;
      set _msg = concat('id = ', new.id, ' nom = ', left(concat(new.nom, '          '),10), ' prenom = ', left(concat(new.prenom,'          '),10), ' date de modification = ', new.update_date);
      insert into `mouchard` (`lib`) values (_msg);
    END
    --------------
     
    --------------
    INSERT INTO `utilisateur` (`nom`,`prenom`) value
      ('einstein','albert'), ('hugo','boss')
    --------------
     
    --------------
    select * from `utilisateur`
    --------------
     
    +----+----------+--------+----------------------------+----------------------------+
    | id | nom      | prenom | create_date                | update_date                |
    +----+----------+--------+----------------------------+----------------------------+
    |  1 | einstein | albert | 2018-10-18 02:32:16.256462 | 2018-10-18 02:32:16.256462 |
    |  2 | hugo     | boss   | 2018-10-18 02:32:16.256462 | 2018-10-18 02:32:16.256462 |
    +----+----------+--------+----------------------------+----------------------------+
    --------------
    update `utilisateur` set `prenom` = 'victor' where `prenom`='boss'
    --------------
     
    --------------
    select * from `utilisateur`
    --------------
     
    +----+----------+--------+----------------------------+----------------------------+
    | id | nom      | prenom | create_date                | update_date                |
    +----+----------+--------+----------------------------+----------------------------+
    |  1 | einstein | albert | 2018-10-18 02:32:16.256462 | 2018-10-18 02:32:16.256462 |
    |  2 | hugo     | victor | 2018-10-18 02:32:16.256462 | 2018-10-18 02:32:16.310373 |
    +----+----------+--------+----------------------------+----------------------------+
    --------------
    select * from `mouchard`
    --------------
     
    +----+-----------------------------------------------------------------------------------------------+
    | id | lib                                                                                           |
    +----+-----------------------------------------------------------------------------------------------+
    |  1 | id = 1 nom = einstein   prenom = albert     date de création     = 2018-10-18 02:32:16.256462 |
    |  2 | id = 2 nom = hugo       prenom = boss       date de création     = 2018-10-18 02:32:16.256462 |
    |  3 | id = 2 nom = hugo       prenom = victor     date de modification = 2018-10-18 02:32:16.310373 |
    +----+-----------------------------------------------------------------------------------------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    Observez bien les dates de créations et de modifications de mon exemple.

    Mais comme je le suppose, vous cherchez quand même à utiliser un déclencheur, j'ai créé une table mouchard reprenant les principales modifications de la table utilisateur.

    @+

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 815
    Billets dans le blog
    14
    Par défaut
    le Trigger qui va insérer une ligne dans la table date_utilisateur pour chaque ligne insérée dans la table utilisateur.

    Voici la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE date_utilisateur(
            id              Int(20) Auto_Increment PRIMARY KEY,
            date_insertion  DATE
    )ENGINE=InnoDB DEFAULT CHARSET=utf8;
    À quoi peut bien servir cette table ?
    Elle contiendra donc une date et un identifiant qui est totalement dénué de signification puisqu'il est auto-incrémenté !

    Que cherchez-vous à faire, plus précisément ?

    Si vous souhaitez avoir la date de création de chaque utilisateur, deux solutions :
    - la simple consiste à ajouter une colonne de type DATE à la table des utilisateurs et de lui donner comme valeur par défaut CURRENT_DATE ;
    - la compliquée consiste à créer votre table mais en ne mettant pas la colonne id en AUTO_INCREMENT ; au contraire, il faut que le trigger spécifie la valeur (de type INTEGER) dans la requête d'insertion.

    D'une manière générale :
    1) Spécifiez toujours les colonnes sur lesquelles agit votre requête.
    Il vaut mieux éviter la guerre des étoiles !

    2) Quand vous avez un identifiant auto-incrémenté, ne mettez pas cet identifiant dans votre requête d'insertion ; le SGBD se débrouille avec.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO utilisateur (nom, prenom)
    VALUES ('Leménager', 'Philippe')
    => La colonne id, non présente ici, sera valorisée automatiquement puisque c'est le but de l'auto-incrément.

    3) Ne donnez pas une valeur textuelle à une colonne numérique !
    Votre requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO date_utilisateur VALUES("", NOW());
    => Vous voulez donner une chaîne vide à une colonne entière !

    4) En SQL, les valeurs textuelles s'écrivent entre apostrophes et non pas entre guillemets (voir ma requête plus haut).
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. la publication de mon appli ne fonctionne pas
    Par tchecko dans le forum Accès aux données
    Réponses: 4
    Dernier message: 07/10/2006, 11h59
  2. Réponses: 1
    Dernier message: 30/08/2006, 19h00
  3. [VB.Net/DataReader] Pourquoi mon ExecuteReader ne fonctionne pas ?
    Par emeraudes dans le forum Accès aux données
    Réponses: 8
    Dernier message: 21/08/2006, 13h38
  4. Réponses: 14
    Dernier message: 17/08/2006, 10h29
  5. mon trigger ne fonctionne pas !
    Par japi33 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 20/03/2006, 21h26

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