Partage
  • Partager sur Facebook
  • Partager sur Twitter

création d'un trigger phpmyadmin

    9 janvier 2017 à 12:58:56

    Hello,

    je crée une base de donnée qui répertorie des hotels et leur responsable.

    Hotels(numHotel, nomHotel, #numResponsable, nbChambresLibres, services)

    Reponsables(numResponsable, nom, prenom, nbHotels)

    du coup j'aimerai créer un trigger qui lorsque l'on ajoute un hotel, vérifie si le reponsaboe est déjà répertorié.

    Si oui alors il incrémente son nombre d'hotel, sinon il crée le responsable. voilà le code:

    create or REPLACE TRIGGER tr_ajoutHotelResponsable before insert on cpoa.hotels for each row
    	begin
        declare @nbResp := (Select count(numResponsable) from cpoa.responsable)
    	declare @newResp := @nbResp + 1
        
    	if new.numReponsable != any(select numResponsable from cpoa.responsable)
        then 
        	insert into cpoa.responsables VALUES (@newResp, null, null, 1)
        ELSE
        	declare @noresp := (select numResponsable from cpoa.responsable  where numResponsable = new.numResponsable) 
        	update cpoa.responsables set nbHotel = nbHotel + 1 where responsables.numResponsable = @noresp
        end if
    end
        

    vous vous doutez bien, le code ne fonctionne pas. donc je sais pas si c'est phpmyadmin qui ne peut pas intégrer de trigger (j'en doute) ou si c'est mon code qui est bidon (plus probable). Votre avis?

    merci à ceux qui prendront le temps de répondre btw :)

    -
    Edité par Kasmir 9 janvier 2017 à 12:59:55

    • Partager sur Facebook
    • Partager sur Twitter
      9 janvier 2017 à 13:48:05

      Bonjour,

      Kasmir a écrit:

      lorsque l'on ajoute un hotel, vérifie si le reponsable est déjà répertorié.

      Si ta base est correctement structurée, tu ne peux pas ajouter un hôtel si le numResponsable n'existe pas dans la table Responsables ... C'est le principe des contraintes de clé étrangère (foreign key). Il doit exister une telle contrainte sur ta table Hotels ...

      Pour créer un hôtel, il faut que le responsable existe au préalable. Si l'hôtel à créer concerne un responsable non encore enregistré, il faut créer l'enregistrement du responsable avant de créer l'hôtel ...

      D'ailleurs dans ton TRIGGER, à la ligne 8 :

      Kasmir a écrit:

      insert into cpoa.responsables VALUES (@newResp, null, null, 1)

      C'est une aberration ... Tu crées un responsable avec un id saisi manuellement et sans données renseignées ... bonjour l'intégrité des données ...

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        9 janvier 2017 à 13:56:59

        je m'en doute bien, c'est un truc perso, je veux juste apparendre a faire des triggers qui fonctionnent. donc je fais des trucs basiques sans me soucier de ça

        en tout cas merci de ta réponse je vais revoir les premiers points que t'as cité

        -
        Edité par Kasmir 9 janvier 2017 à 14:01:43

        • Partager sur Facebook
        • Partager sur Twitter
          9 janvier 2017 à 14:16:06

          Du coup cela dépend de si tu veux travailler proprement ou pas :p

          Ici tu comptes le nombre de responsables pour déterminer l'id à créer ... Cela ne veut pas dire que l'id calculé ainsi n'existe pas ... Tu peux avoir 9 responsables en base mais avec comme numResponsable : 1, 2, 7, 10, 25, 55, 70, 92, 210 ...

          Du coup ton TRIGGER ferait 9 +1 = 10 et essaierait de créer un responsable id = 10 ce qui planterai que cet id existe déjà ...

          Si l'on reprend ton exemple sans trop se soucier du fait que tu crées un responsable vide ... alors :

          DELIMITER &&
          
          CREATE OR REPLACE TRIGGER tr_ajoutHotelResponsable
          BEFORE INSERT ON cpoa.hotels
          FOR EACH ROW
          BEGIN
          	IF(
          		EXISTS(
          			SELECT *
          			FROM cpao.responsables
          			WHERE numResponsable = NEW.numResponsable
          		)
          	)
          	THEN
          		UPDATE cpoa.responsables
          		SET nbHotel = nbHotel + 1
          		WHERE numResponsable = NEW.numResponsable;
          	ELSE
          		INSERT INTO cpao.responsables ( nom, prenom, nbHotels )
          		VALUES ( 'nouveau', 'nouveau', 1 );
          		
          		SET NEW.numResponsable = LAST_INSERT_ID();
          	END IF;
          END&&
          
          DELIMITER ;
          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            9 janvier 2017 à 14:27:25

            en fait je partais du postulat le numéro d'un reponsable était celui du précédent + 1, par exemple 1,2,3,4,5...n pour n repsonsables. J'avais imaginé ces tables vite fait mais c'est vrai qu'après coup si on supprime un responsable ça pose problème (même si on peut se débrouiller avec un autre trigger mais c'est pas propre)

            du coup LAST_INSERT_ID serait une fonction qu'on doit créer qui permet de rentrer un id?

            -
            Edité par Kasmir 9 janvier 2017 à 14:28:21

            • Partager sur Facebook
            • Partager sur Twitter
              9 janvier 2017 à 14:47:53

              Kasmir a écrit:

              LAST_INSERT_ID serait une fonction qu'on doit créer qui permet de rentrer un id?

              Non, c'est une fonction existante de MySQL qui récupère le dernier ID créé lors d'un INSERT INTO. Ici cette fonction retourne donc l'ID du responsable créé juste avant.
              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

              création d'un trigger phpmyadmin

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown