Partage
  • Partager sur Facebook
  • Partager sur Twitter

Trigger en cascade

    17 mars 2011 à 22:20:57

    Bonsoir tout le monde,

    C'est encore moi ^^ J'ai un problème de trigger en cascade.
    Voici 3 triggers installés sur ma base de donnée, je n'ai eu aucun souci pour les exécuter.

    DROP TRIGGER IF EXISTS carrieres1//
    CREATE TRIGGER carrieres1
    AFTER INSERT ON emplois
    FOR EACH ROW
    BEGIN
        UPDATE carrieres SET debauche = CURDATE() WHERE pID = NEW.pID AND debauche = '0000-00-00';
        INSERT INTO carrieres (pID, eID, salaire, embauche) VALUES (NEW.pID, NEW.eID, NEW.salaire, NOW());
    END//
    
    
    DROP TRIGGER IF EXISTS carrieres2//
    CREATE TRIGGER carrieres2
    AFTER DELETE ON emplois
    FOR EACH ROW
    BEGIN
        UPDATE carrieres SET debauche = CURDATE() WHERE pID = OLD.pID AND debauche = '0000-00-00';
    END//
    
    DROP TRIGGER IF EXISTS entreprises//
    CREATE TRIGGER entreprises
    AFTER INSERT ON entreprises
    FOR EACH ROW
    BEGIN
        INSERT INTO filiales (eID, nom) VALUES (NEW.eID, "Siège social");
        INSERT INTO emplois (pID, eID, fID, gID, salaire, embauche) VALUES (NEW.pID, NEW.eID, LAST_INSERT_ID(), 1, 5000, NOW());
        UPDATE perso SET argent = argent–5000 WHERE pID = NEW.pID;
    END //
    


    L'idée c'est d'automatiser le travail lorsqu'un utilisateur crée une entreprise. De cette façon, dans mon script php, je n'ai qu'une requête à exécuter. Logiquement, ce que je veux c'est que lorsque l'utilisateur crée une entreprise, une filiale soit créée automatiquement avec en FK la PK de la nouvelle entreprise, ainsi qu'une nouvelle ligne se crée dans la table emplois (avec en FK la PK de la filiale et la PK de l'entreprise) et mettre à jour le compte en banque de l'utilisateur. C'est ce que j'ai cherché à faire avec le trigger entreprises. Ce qui nous amène au trigger carriere1 puisqu'en toute logique, une nouvelle ligne est insérée dans la table emplois, ce nouveau trigger lui doit mettre à jour les lignes de la table carriere de l'utilisateur en fonction de son pID récupéré de la table emplois.

    Le souci maintenant, c'est que lorsque dans le jeu, l'utilisateur crée une entreprise, j'ai une erreur que je comprends dans son sens mais je ne comprends pas pourquoi il y a cette erreur. Je passe à coté, sans doute est-ce la fatigue...

    Voici l'erreur,
    SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`kapital`.`emplois`, CONSTRAINT `emplois_ibfk_1` FOREIGN KEY (`pID`) REFERENCES `carrieres` (`pID`) ON DELETE CASCADE ON UPDATE CASCADE)


    Ce que je ne comprends pas, c'est que techniquement le pID est transporté de table en table. Voici ma requête d'insertion d'une nouvelle entreprise.

    INSERT INTO entreprises (nom, creation, pID, nb_employes, sID)
    VALUES(:nom, NOW(), :pID, 1, :sID)
    


    Il y a donc bien un pID d'insérer, qui correspond au pID de la session en cours et qui donc existe bien dans la table membres, table à laquelle fait référence la FK pID des tables filiales et emplois ou encore carriere. Fin bref, NEW.pID normalement existe...

    Si quelqu'un pouvait m'expliquer où j'ai foiré dans mon raisonnement, merci d'avance ;)
    En espérant ne faire fuir personne avec tout ce bordel. ^^
    • Partager sur Facebook
    • Partager sur Twitter
      19 mars 2011 à 14:15:36

      Personne pour comprendre la situation et la résoudre ? :(
      • Partager sur Facebook
      • Partager sur Twitter

      Trigger en cascade

      × 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