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

SQL Procédural MySQL Discussion :

Les Triggers : Delete en cascade ...


Sujet :

SQL Procédural MySQL

  1. #1
    Membre régulier Avatar de foolib
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 111
    Points : 90
    Points
    90
    Par défaut Les Triggers : Delete en cascade ...
    Je n'arrive pas à faire fonctionner deux triggers en cascade ..

    Jusqu' alors je supprimai tout en php, DELETE successif etc.
    Pour economiser quelques requêtes et des lignes de code, je décide de profiter des déclencheurs ou plus communément appelé triggers.

    Mon problème est le suivant :
    J'ai 3 tables

    'categorie'
    'topic'
    'message'

    La table 'topic' possède un champ avec une contrainte d'intégrité sur le champ id (clef primaire) de la table 'categorie' ...
    De même que la table 'message' possède un champ avec une contrainte d'intégrité sur le champ id (clef primaire) de la table 'topic' ...

    Lorques je souhaite supprimer une categorie, j'aimerai que mes triggers réagissent en cascade :
    Suppression des topics liés à la catégorie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TRIGGER Suppr_Categ_Topics 
    BEFORE DELETE ON categorie
    FOR EACH ROW
    DELETE FROM topic
    WHERE topic.categID = Old.idcategorie;
    Suppression des messages liés au topic
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TRIGGER Suppr_Topics_Mess BEFORE DELETE ON topic
    FOR EACH ROW
    DELETE FROM message
    WHERE message.topicID = Old.idtopic

    Mais quand tout est (à mon sens) bien ficellé, j'obtien l'erreur suivante :

    Cannot delete or update a parent row:
    A foreign key constraint fails (`forum/message`, CONSTRAINT `fk_message_message` FOREIGN KEY (`messageoriginal`) REFERENCES `message` (`idmessage`) ON DELETE NO ACTION ON UPDATE NO ACTION)

    comme si mes triggers n'existaient pas ... ou bien ai-je manqué un episode sur les triggers ?

    Au secours !

  2. #2
    Membre régulier Avatar de foolib
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 111
    Points : 90
    Points
    90
    Par défaut Une piste !
    Je pense avoir trouvé le soucis :

    Il faut prendre garde à bien renseigner les options des FOREIGN KEY

    S'arranger pour que le champ ciblé (en principe une clef primaire) dans la table cible puisse être NULL
    Pour La FOREIGN KEY mettre comme option "ON DELETE SET NULL ON UPDATE CASCADE"

    Dans mon cas ces options étaient mises à NO ACTION sans doute cela créait-il un conflit.

    Ma suppression se fait donc bien en cascade, grace à 2 triggers, ce qui est fort efficace, économise du temps d'exécution et des lignes de codes

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Il me semble qu'avec ON DELETE CASCADE, c'est carrément le SGBD qui fait le boulot tout seul :
    Si tu supprimes une catégorie, ne devrait-il pas supprimer en cascade et automatiquement les topics et les messages ?

    Edit :
    Je viens de tester avec MySQL et ça marche. La suppression de la catégorie 2 supprime en cascade les topics de la catégorie et les messages des topics de la catégorie.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Membre régulier Avatar de foolib
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 111
    Points : 90
    Points
    90
    Par défaut
    okey merci j'essaierai ...
    En fait tout dépendant des données concernées, si je souhaite conserver les messages existants mais supprimmer la catégorie pour les futurs nouveau post,
    je laisserai ON DELTE SET NULL par exemple.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/03/2014, 12h18
  2. problème avec les trigger delete
    Par mb10 dans le forum Administration
    Réponses: 3
    Dernier message: 25/01/2012, 16h46
  3. TRIGGER INSTEAD OF DELETE et DELETE ON CASCADE
    Par stephane.julien dans le forum Développement
    Réponses: 5
    Dernier message: 22/06/2011, 17h50
  4. [Triggers] Deletes en cascade récalcitrants
    Par Coplan dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/07/2005, 09h19
  5. Delete on cascade avec SQL server
    Par fadoua dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 14/01/2004, 11h02

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