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 pour copier la valeur d'une colonne dans une autre


Sujet :

SQL Procédural MySQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Avril 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Avril 2019
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Trigger pour copier la valeur d'une colonne dans une autre
    Bonjour à tous,

    J'ai un problème qui je suis sur est très simple à résoudre, mais je bloque malgré mon acharnement. Je crée mon 1er trigger.
    J'ai une table canonicalurls_lang avec entre autre 2 colonnes id_object (clé primaire) et id_product
    Je souhaiterai qu'à chaque fois qu'il y ait un INSERT dans cette table, cela me copie la valeur id_object nouvellement créée, dans la colonne id_product

    J'ai donc fait le trigger suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    create trigger URL_CANONIQUE AFTER INSERT
    ON canonicalurls_lang
    FOR EACH ROW
    update canonicalurls_lang set new.id_product = new.id_object;
    Et ben, cela ne fonctionne pas.
    Si quelqu'un à une piste je lui serai bien reconnaissant.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 262
    Points : 12 936
    Points
    12 936
    Par défaut
    Bonjour,
    Citation Envoyé par Grouik11 Voir le message
    Et ben, cela ne fonctionne pas.
    Mais encore ?
    Tu as un message d'erreur (laquelle) ?
    Rien n'est mis à jour ?
    Toutes les lignes de la table sont mises à jour avec la dernière version insérée ?

    Tatayo.

  3. #3
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Avril 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Avril 2019
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Bonjour Tatayo,
    Merci de te pencher sur mon souci.
    En temps normal, quand je crée un article sur mon site de ecommerce et que j'indique une url canonique à mon article dans un champ prévu à cet effet, une ligne se créée dans ma table « canonicalurls_lang » avec une incrémentation de la colonne id_object.
    Quand je mets le trigger en place, que je crée un article en remplissant le champs "url canonique", il n’y a aucune ligne qui se crée dans la table « canonicalurls_lang », et mon champs dans mon back office s'efface, redevient vierge quand je valide l'enregistrement. Je n'ai pas de message d’erreur.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 262
    Points : 12 936
    Points
    12 936
    Par défaut
    Après une rapide recherche, il faut utiliser OLD et NEW comme "table" pour faire des mises à jour sur la ligne concernée.
    Tu verras aussi qu'il te faut utiliser un trigger BEFORE, et non AFTER.

    Tatayo.

  5. #5
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Avril 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Avril 2019
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    J'avais déjà essayé avec BEFORE qui me semblait efectivement plus judicieux, et j'utilise bien NEW comme il faut me semble-t-il.
    J'ai donc refait mon trigger comme ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE trigger URL_CANONIQUE_JEFF BEFORE INSERT
    ON canonicalurls_lang
    FOR EACH ROW
    update canonicalurls_lang set NEW.id_product = NEW.id_object
    J'ai le même résultat, aucune ligne ne se crée dans ma table "canonicalurls_lang", donc il n'y a aucune copie de valeur d'une colonne à l'autre.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 262
    Points : 12 936
    Points
    12 936
    Par défaut
    Il ne faut pas faire un update sur la table d'origine, mais affecter directement les valeurs aux colonnes de la pseudo-table NEW avec un SET.
    Tu as un exemple dans le lien que je t'ai donné.

    Tatayo.

  7. #7
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 483
    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 483
    Points : 19 503
    Points
    19 503
    Par défaut
    Salut à tous.

    Voici un exemple de recopie d'une colonne dans une autre, dont le déclencheur agit avant l'insert et non après.
    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
    --------------
    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,
       `val1`   integer          not null,
       `val2`   integer              null
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`val1`) values (1)
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+------+------+
    | id | val1 | val2 |
    +----+------+------+
    |  1 |    1 | NULL |
    +----+------+------+
    --------------
    commit
    --------------
     
    --------------
    DROP TRIGGER IF EXISTS `recopie`
    --------------
     
    --------------
    CREATE TRIGGER `recopie`
    BEFORE insert ON `test`
    FOR EACH ROW
    BEGIN
            SET NEW.val2 = NEW.val1;
    END
    --------------
     
    --------------
    insert into `test` (`val1`) values (2),(3)
    --------------
     
    --------------
    select * from  `test`
    --------------
     
    +----+------+------+
    | id | val1 | val2 |
    +----+------+------+
    |  1 |    1 | NULL |
    |  2 |    2 |    2 |
    |  3 |    3 |    3 |
    +----+------+------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    @+

  8. #8
    Candidat au Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Avril 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Avril 2019
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Impeccable !,
    Grand merci à tous les 2, c'est une affaire qui roule, j'ai juste enlevé l'Update (qui me semblait logique).

    Bonne journée à tous !!!

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/05/2016, 12h27
  2. Code JavaScript pour copier la valeur d'une liste déroulante
    Par cool2505 dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 13/10/2014, 13h26
  3. Réponses: 4
    Dernier message: 01/10/2009, 22h34
  4. Réponses: 6
    Dernier message: 29/11/2007, 16h15
  5. Réponses: 3
    Dernier message: 26/02/2007, 10h52

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