Partage
  • Partager sur Facebook
  • Partager sur Twitter

Verifier si une valeur existe dans la BDD trigger

Trigger, procédure stockée, fonction stockée

13 mars 2019 à 14:09:59

Bonjour, 

J'ai créé une base de données et je laisse le choix à l'utilisateur de rentrer des valeurs dans la base de données mais avant de faire l'insertion je souhaite activer un trigger. J'ai pour cela travaillé sur plusieurs pistes mais aucune n'est concluante...

A noter, je ne sais pas non plus quelle est la condition pour dite "si une valeur existe". Ou bien alors on m'a également parlé d'une procédure stockée avec un count et de l'utiliser dans mon trigger mais je n'en ai aucune idée de comment faire. 

Je sais, je pourrais utiliser une fonction php, mais un trigger, une procédure ou fonction stockée ou procédure stockée. 

delimiter // /*On créé un delimiteur qui neutralise les ; a partir de la ligne courante*/
CREATE TRIGGER verif BEFORE INSERT ON ESPECE
select idEspece from ESPECE
  FOR EACH ROW
  BEGIN /*NEW =nouvelle valeur que l'on va rentrer*/
    IF NEW.idEspece == idEspece THEN
      SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='ID déja utilisée';
    ELSEIF NEW.idEspece <>  idEspece THEN
      SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='Ajout terminé';
    END IF;
  END;
  // delimiter /*fin du delimiteur*/



delimiter // /*On créé un delimiteur qui neutralise les ; a partir de la ligne courante*/
CREATE TRIGGER verifIdEspece BEFORE INSERT ON criee_cornouaille.ESPECE
  FOR EACH ROW
  BEGIN /*NEW =nouvelle valeur que l'on va rentrer*/
  SELECT idEspece FROM ESPECE
    IF new.idEspece = idEspece THEN
      DELETE FROM ESPECE WHERE idEspece=new.idEspece
      SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='ID déjà enregistré';
    ELSE
    SET MESSAGE_TEXT ='Insertion OK'
  END;
  // delimiter /*fin du delimiteur*/
DELIMITER |

CREATE PROCEDURE VerifIdEspece (IN unId INT, INOUT message int)
BEGIN
    SELECT idEspece from ESPECE
    WHERE ESPECE.idEspece = unId;
END |

DELIMITER ;
DELIMITER $$
CREATE TRIGGER verifierEspece
BEFORE INSERT ON ESPECE       -- faut le faire séparément pour insert et update,
                             -- pas de "insert or update", lol
FOR EACH ROW
BEGIN
    DECLARE existedeja INTEGER;  -- patois local (1 DECLARE par variable)...

    -- pas besoin de recompter toute la table comme dans le post du dessus !...
    -- un test d'existence suffit.
    SELECT EXISTS( SELECT *
      FROM ESPECE
      WHERE idEspece = NEW.idEspece
    ) INTO existedeja;

    -- Normalement on utiliserait la variable spéciale FOUND (non supportée sous mysql)

    IF existedeja THEN
        erreur -- la façon de faire ça dépend de ta version de mysql...
    END IF;
END;
$$
DELIMITER ;
delimiter //
 CREATE TRIGGER idEsp BEFORE INSERT ON ESPECE
      FOR EACH ROW
      BEGIN
          IF NEW.idEspece exists THEN
              SET NEW.amount = 0;
          ELSEIF NEW.amount > 100 THEN
              SET NEW.amount = 100;
          END IF;
      END;//
 delimiter ;

Si vous avez des pistes ou quelque chose qui pourrait m'aider n'hésitez pas hehe ! 

Merci pour votre aide :D





Voila mes pistes 

  • Partager sur Facebook
  • Partager sur Twitter
13 mars 2019 à 17:05:16

Bonjour,

Si je comprends bien, tu veux empêcher d'insérer un enregistrement si il existe déjà un enregistrement dans la table qui porte le même idEspece ...

Si c'est bien cela, je te conseille fortement la (re)lecture de ton cours SQL sur les clés ...

Cela s'appelle simplement une contrainte d'unicité (UNIQUE), et dans ce cas particulier je dirait même une contrainte de clé primaire (PRIMARY).

Si je me trompe, peux-tu exprimer clairement ce que tu cherches à faire et la structure (tables, colonnes, types, contraintes) de ta base ...

-
Edité par Benzouye 13 mars 2019 à 17:06:22

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
15 mars 2019 à 9:39:19

Bonjour, 

Oui c'est bien cela que je souhaite faire, mais je souhaite également prévenir l'utilisateur. 

En effet, la contrainte d'unicité est appliquée car il n'y a pas d'enregistrement, mais je souhaiterai juste prévenir l'utilisateur du genre "Vous ne pouvez pas utiliser cet ID, il est déjà utilisé par une autre espèce" tout cela avec un trigger. 

  • Partager sur Facebook
  • Partager sur Twitter
15 mars 2019 à 9:57:00

Pas besoin de TRIGGER ... Si tu mets une contrainte UNIQUE (ou une clé primaire) lorsque l'utilisateur va tenter d'insérer une valeur déjà existante, alors le SGBD va retourner une erreur "Duplicate entry" (pour MySQL c'est le code d'erreur 26000). A toi de traîter cette erreur pour afficher un message "user friendly" dans ton application ...

-
Edité par Benzouye 15 mars 2019 à 9:57:28

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
15 mars 2019 à 10:29:09

Oui j'ai effectivement vu cette possibilité, mais je suis malheureusement contraint de faire un trigger, meme si je sais, cela n'a pas trop de sens
  • Partager sur Facebook
  • Partager sur Twitter
15 mars 2019 à 13:29:41

Seb167 a écrit:

je suis malheureusement contraint de faire un trigger

C'est probablement parce que tu as d'autres choses à contrôler, des valeurs pour "amount" apparemment ...

Faire un TRIGGER ne changera rien dans le cas d'une clé primaire, si une valeur existe déjà alors le TRIGGER ne sera même pas exécuté et l'erreur "duplicate" sera levée ...

Je pense que tu devrais préciser ton cahier des charges, la structure des tables en question et les contraintes que tu dois mettre en oeuvre pour que l'on puisse t'aider ...

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
15 mars 2019 à 13:35:15

ah oui effectivement je n'avais pas pensé à cela ! Merci en tout cas pour ces elements je vais essayer de voir cela !
  • Partager sur Facebook
  • Partager sur Twitter