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

Langage SQL Discussion :

Aide sur les triggers


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Homme Profil pro
    A la découverte de la POO
    Inscrit en
    Mai 2009
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : A la découverte de la POO

    Informations forums :
    Inscription : Mai 2009
    Messages : 93
    Points : 61
    Points
    61
    Par défaut Aide sur les triggers
    Bonjour à Tous,

    Voila mon problème :
    j'ai une table avec des romans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE IF NOT EXISTS `liste_romans` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `Titre` varchar(100) NOT NULL,
      `Auteur` varchar(50) NOT NULL,
      `Infos` varchar(100) NOT NULL,
      `Editeur` varchar(30) NOT NULL,
      `moyenne` smallint(6) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=153 ;

    Pour chaque roman, il est possible d'y mettre une note, celle ci est rentrée ici meme :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE IF NOT EXISTS `gestion_critiques` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `id_roman` int(11) NOT NULL,
      `Pseudo` varchar(30) NOT NULL,
      `Date` date NOT NULL,
      `Note` tinyint(4) NOT NULL,
      `Commentaire` text NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=132 ;

    Ce que je veux c'est, entre autre, afficher les romans avec la moyenne des notes .
    Pour cela, avant je faisais mon traitement en PHP dans la boucle qui gérait mon tableau ...
    mais ça c'était avant

    Maintenant, j'ai créé une vue (j'ai découvert l'existence des vues )


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `vue_romans_moyenne` AS select `r`.`id` AS `id`,`r`.`Titre` AS `titre`,`r`.`Auteur` AS `auteur`,avg(`c`.`Note`) AS `moyenne`,`r`.`Infos` AS `infos`,`r`.`Editeur` AS `editeur` 
    from (`liste_romans` `r` left join `gestion_critiques` `c` on((`r`.`id` = `c`.`id_roman`))) 
    group by `r`.`Titre` 
    order by avg(`c`.`Note`) desc;

    Ce que je voudrai maintenant c'est, avec un trigger, mettre à jour cette vue, à chaque insertion ou modification de critique d'un roman.

    CREATE TRIGGER after_insert_critiques AFTER INSERT ON gestion_critiques
    et la il faudrait prendre toutes les notes de l'id roman avec NEW.id_roman,
    en faire la moyenne et mettre à jour la vue

    Mais je manque trop de pratique pour réaliser ce genre d'opération.
    D'ou l'objet de mon post

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Bonjour,

    1) Tu n'as pas besoin de trigger ( Renseigne toi un peu plus sur le fonctionnement des vues)

    2) Ajoute toutes les colonnes à ton GROUP BY ( sauf moyenne) car sans, tu auras des résultats faux ( Notamment si deux livres ont le même titre)

    3) Ajoute un index sur id_roman

  3. #3
    Membre du Club
    Homme Profil pro
    A la découverte de la POO
    Inscrit en
    Mai 2009
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : A la découverte de la POO

    Informations forums :
    Inscription : Mai 2009
    Messages : 93
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par Fred_34 Voir le message
    Bonjour,

    1) Tu n'as pas besoin de trigger ( Renseigne toi un peu plus sur le fonctionnement des vues)
    Tu sous entends qu'il y a un moyen pour que cela reste à jour ,
    as tu une source à me conseiller ?
    je n'ai que un livre sur MySQl qui ne va pas en profondeur sur ce sujet ...

    Citation Envoyé par Fred_34 Voir le message
    2) Ajoute toutes les colonnes à ton GROUP BY ( sauf moyenne) car sans tu aura des résultats faux ( Notamment si deux livres ont le même titre)
    C'est un point que j'ai lu dans le livre mais je suis dépassé par la logique ...
    Bon, je n'ai aucun livre avec des titres identiques mais j'aimerai comprendre pourquoi il faut faire le GROUP BY tous mes elements.

    Pour le faire, je suis obligé de supprimer puis recréer ma vue ?


    Citation Envoyé par Fred_34 Voir le message
    3) Ajoute un index sur id_roman
    Merci pour ce rappel, c'est fait

  4. #4
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031

  5. #5
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut
    Bonjour,

    Je vous conseille d'aborder la partie tutoriel de ce site qui est très bien faite.

    Pour les vues, vous pouvez commencer par ça : http://sqlpro.developpez.com/cours/s...age=partie2#L8

    Cordialement,

    Arkhena

  6. #6
    Membre du Club
    Homme Profil pro
    A la découverte de la POO
    Inscrit en
    Mai 2009
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : A la découverte de la POO

    Informations forums :
    Inscription : Mai 2009
    Messages : 93
    Points : 61
    Points
    61
    Par défaut
    une vue peut être mise à jour (INSERT, UPDATE, DELETE) que si elle obéit à un certain nombre de conditions :

    • ne porter que sur une table (pas de jointure)
    • ne pas contenir de dédoublonnage (pas de mot clef DISTINCT) si la table n'a pas de clef
    • contenir la clef de la table si la table en a une
    • ne pas transformer les données (pas de concaténation, addition de colonne, calcul d'agrégat...)
    • ne pas contenir de clause GROUP BY ou HAVING
    • ne pas contenir de sous requête
    • répondre au filtre WHERE si la clause WITH CHECK OPTIONS est spécifié lors de la création de la vue


    Oups je ne réponds pas vraiment aux critères

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Une vue est en quelque sorte une requête nommée.
    A chaque fois que vous faites appel à une vue, la requête correspondante est executée, et prendra en compte les modifications qui ont été faites sur la ou les tables sur lesquelles elle porte.

    Quand on parle de mise à jour de vues, c'est en fait la table sur laquelle elle porte qui sera mise à jour. C'est bon à savoir et ça peut être très utile de mettre à jour des tables par l'intermédiaire de vue, mais ça n'a rien à voir avec votre besoin.

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Une vue, c'est juste une requête stockée en base et réexécutée à chaque appel.
    Donc ton cas, il est inutile de vouloir mettre à jour la vue.

    [edit]grillé par snipah qui est en plus, plus complet

  9. #9
    Membre du Club
    Homme Profil pro
    A la découverte de la POO
    Inscrit en
    Mai 2009
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : A la découverte de la POO

    Informations forums :
    Inscription : Mai 2009
    Messages : 93
    Points : 61
    Points
    61
    Par défaut
    ARRRRGH,
    un grand merci à vous tous, en fait cette vue est ré exécutée et donc se met à jour sans que je fasse quoi que ce soit ...

    Moi qui me lançais dans des spéculations avec des triggers ...

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

Discussions similaires

  1. [2012] Besoin d'aide sur les triggers
    Par layesanga dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 29/03/2013, 19h53
  2. aide sur les triggers en oracle
    Par tsague dans le forum Administration
    Réponses: 5
    Dernier message: 28/01/2008, 14h28
  3. petite aide sur les transactions et triggers SVP
    Par CharleLéo dans le forum Débuter
    Réponses: 4
    Dernier message: 15/11/2004, 20h43
  4. Petite aide sur les triggers ?
    Par krimson dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 16/04/2004, 16h28

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