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

Requêtes MySQL Discussion :

Trigger : incrémenter un champ selon un autre champ


Sujet :

Requêtes MySQL

  1. #1
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut Trigger : incrémenter un champ selon un autre champ
    Bonjour à tous et à toutes,

    J'aimerai savoir s'il est possible d'incrementer un champ selon la valeur d'un autre champ avec un trigger!

    Je possede une table 'maj_table' qui contient 3 champs: id, id_maj, table_maj

    A chaque fois qu'une application est exécuté, des tables sont mis à jour et ajouté dans ma table 'maj_table'. La dernière table ajoutée est toujours la même (appelons la 'jouet'). Ce que j'aimerai c'est que la valeur du champ id_maj soit incrémenté à chaque execution de mon application.

    Voici un résultat que j'aimerai avoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    id     id_maj    table_maj
    1      1          basket
    2      1          foot
    3      1          commandes
    4      1          livraisons
    5      1          jouet
    6      2          commandes
    7      2          livraisons
    8      2          livraisons_retour
    9      2          jouet
    Donc, en réalité à chaque fois que je rencontre 'jouet' dans le champs table_maj, j'incrémente le champ id_maj.


    Quelqu'un aurait une idée ?

    Merci d'avance

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    pour commencer, à ta place, je créerais une table pour referencer les tables :
    T_TABLE
    IDTable----NomTable
    1 ----- commandes
    2 ----- livraisons
    3 ----- jouet
    ...
    et j'utiliserais l'id dans ta table maj_table au lieu du nom
    ça évitera des erreurs (genre un même table orthographiée de deux façons différentes : livraison/livraisons)
    Et en plus cela améliorera les performances (le SGBDR travaillera sur des entier au lieu de chaines de caracteres...)

    Ensuite, j'éviterais de passer par un trigger pour faire ce que tu veux.
    dans la table maj_table, je mettrais trois colonnes :
    1/ idMaj_Table
    2/ dateheure
    3/ idTable

    avec une simple requête utilisant une fonction de fenêtrage, tu pourras connaitre la version de mise a jour :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT 
    	IDTable, 
    	dateheure, 
    	ROW_NUMBER() OVER (
    		PARTITION BY IDTable 
    		ORDER BY Dateheure
    	) AS NumMaj
    FROM maj_table

    deux questions :
    1/ pourquoi veux-tu faire cela(à quoi doit te servir id_maj par la suite) ?
    2/ quel est ton SGBDR ?

  3. #3
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Merci de ta réponse.
    1) Ceci me permet de gérer des script de synchronisation. Ainsi si il y a une erreur dans mes script je pourrait connaitre à quel moment (avec id_maj) et sur quel table il y a eu une erreur. il est donc plus simple de corriger l'erreur.

    2) J'utilise MySQL

  4. #4
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    A quoi sert ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ROW_NUMBER() OVER (
    		PARTITION BY IDTable 
    		ORDER BY Dateheure
    	) AS NumMaj
    De plus, il n'est donc pas possible de passer par des triggers (du moins vous me le déconseillez).

    J'ai avancer dans mon problème d'une autre manière qui fonctionne presque mis à part un gros détail :p

    En faite j'ai créé une table stockant l'id_maj. J'aimerai qu'à chaque mis à jour (rencontre de la table 'jouet') je fais un update sur cette table pour incrémenter l'id qui me servira à faire mon insert par la suite.
    (
    L'idée de base etant de faire un trigger sur la table maj_table qui updatera la table contenant l'id_maj si le champ table_maj inséré a pour valeur 'jouet'
    )

    Avez vous une idée ou savait vous comment programmé l'idée en vert? (peut être que c'est la même mais je n'ai pas bien compris l'idée de la partition )

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Cela sert à avoir le "numero de ligne" dans une fenêtre donnée, ici le numero de ligne est propre à chaque IDTable et ordonné selon la date et l'heure...

    Mais MySQL n'implémente pas ce type de fonction...

    mais pourquoi ne pas stocker simplement la date de mise à jour. cela te donnera suffisamment d'informations pour le débogage...

    Sinon, pour continuer sur ton idée de seconde table :
    ton application, avant de mettre à jour les tables, crée une ligne dans cette table et récupère l'ID autoincrémenté, pour l'inserer dans la table maj_table à chaque fois qu'elle met a jour une table. Pas besoin de trigger. En plus, s'appuyer sur le nom de la "dernière" table mise à jour, ça risque de rendre la maintenance compliquée...

  6. #6
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Merci pour ton aide, je vais m'en inspirer

    mais pourquoi ne pas stocker simplement la date de mise à jour. cela te donnera suffisamment d'informations pour le débogage...
    Car je ne fais pas qu'une synchronisation par jour mais des 10ène

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    heu... oui !

    Par date, je sous entendais éventuellement les heures aussi, les minutes, les seconde, voire les millisecondes si besoin

  8. #8
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    si je prend en compte les secondes, j'aurai zapper plusieurs mis à jours (imaginons que l'utilisateur clique 2 fois sur mis à jours).

    Cependant, j'ai trouvé une solution simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    UPDATE correl
    		SET id = (SELECT id + 1)
    		WHERE id = (SELECT id) -- ne sert peut être à rien
    		AND id IN
    		(SELECT maj_table.id_maj
    		FROM maj_table
    		WHERE maj_table.table = "jouet"
    		AND maj_table.id_maj = id)

  9. #9
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut


    Effectivement, le WHERE ne sert à rien, puisqu'il sera toujours vrai
    et je ne suis pas sur de bien comprendre le but de tout ça...

    au pire, pourquoi ne pas gérer dans votre application : quand vous insérez votre ligne dans table_maj :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    INSERT INTO table_maj (id_maj, table_maj)
    SELECT COALESCE(MAX(id_maj), 0) + 1, 'leNomDeLaTable'
    FROM maj_table
    WHERE table_maj = 'jouet'

  10. #10
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Points : 2 808
    Points
    2 808
    Par défaut
    Oui merci ca pourrait aussi fonctionner. Je vais essayer de l'integrer.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/03/2015, 19h07
  2. Requête SQL - fonction iff & calcul d'un champ selon d'autres champs
    Par Séphirée dans le forum Requêtes et SQL.
    Réponses: 14
    Dernier message: 10/05/2013, 22h51
  3. [AC-2003] Numérotation automatique d'un champ selon un autre champ
    Par moht66 dans le forum VBA Access
    Réponses: 2
    Dernier message: 21/02/2011, 16h49
  4. [AC-2003] Comment rendre champ inaccessible selon réponse autre champs?
    Par Souriane dans le forum IHM
    Réponses: 7
    Dernier message: 27/11/2009, 21h05
  5. Affichage données selon un autre champ : Requête ou VBA?
    Par Noemy23 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 03/07/2007, 13h13

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