Trigger MySQL 5

Trigger MySQL 5 - SQL/NoSQL - Programmation

Marsh Posté le 03-04-2008 à 00:35:15    

Bsr
Je suis a mes début de mySQL et même de SQL. Et donc avec mes premier PB.
 
Soit 2 tables
Table CAT
id INT(10)
Name VARCHAR(25)
 
Table Link
id INT(11)
id_cat INT(11)
Title VARCHAR(45)
 
Une catégorie peut avoir plusieurs link mais pas l'inverse.
 
Je désir par trigger supprimer tous les links après supression d'une catégorie.
 
J'ai donc écris ce trigger:
CREATE trigger del_Cat AFTER DELETE ON categories  
FOR each ROW  
DELETE links FROM `links` WHERE `id_cat` = `id` ;
 
Or cela ne fonction pas totalement seul un seul enregistrement de link est supprimé.
Commet faire pour que ce trigger supprime tous les links dont le links.id_cat = cat.id
 
De plus est-il possible de faire déclencher un fonction depuis un trigger.
 
Merci de votre aide

Reply

Marsh Posté le 03-04-2008 à 00:35:15   

Reply

Marsh Posté le 03-04-2008 à 11:42:48    

personne ne peux m'aider ?

Reply

Marsh Posté le 03-04-2008 à 11:43:51    

Personne ne peux m'aider ?  :??:

Reply

Marsh Posté le 03-04-2008 à 12:13:43    

Ta requête d'effacement doit-être fausse car j'ai des trigger identique chez moi et cela marche très bien.

Reply

Marsh Posté le 03-04-2008 à 12:20:00    

Si si elle fonction cette DELETE
Mais seul un des enregistrement de links fait l'objet du DELETE.
 

Reply

Marsh Posté le 03-04-2008 à 13:41:44    

En faite voici mes data:
 
Table CAT
Id         Name
1          A
2          B
 
Table link
Id         id_cat           Title
1          1                  AA  
1          1                  AB
1          2                  BA
1          1                  AC
1          2                  BB
 
Si je fait un DELETE table CAT where id=1
 
Seul un enregistrement de link est delete
 
Donc je pense que ceci viens du fait que je ne dispose que d'un enregistrement dans CAT impacté par mon delete.
un peu comme un "for each row" qui ne passe qu'une seule fois.
 
donc est-il possible de lancer une procédure depuis mon trigger.
tel que
CREATE PROCEDURE del_by_CatID(Catid INT)
BEGIN
DELETE links FROM `links` WHERE id=CatId
END;
 
CREATE TRIGGER del_cat AFTER DELETE on CAT
BEGIN
FOR EACH ROW
CALL del_by_CatID(OLD.id);
END;
 
Mais impossible de parvenir a créer. J'ai des Pb de syntaxe.
 
Une aide, mereci

Reply

Marsh Posté le 03-04-2008 à 14:08:24    

A l'heure actuelle, on ne peut pas lancer de procédure depuis un trigger
 
par contre tu pourrais essayer un truc du genre :
 

Code :
  1. CREATE trigger del_Cat AFTER DELETE ON categories 
  2. FOR each ROW 
  3. DELETE links FROM `links` WHERE `id_cat` = `OLD.id` ;

Reply

Marsh Posté le 03-04-2008 à 17:31:11    

OK merci

Reply

Marsh Posté le 17-04-2008 à 11:48:30    

Si j'ai bien compris le cas, il suffit de mettre une clé étrangère sur la table LINK pointant vers la table CAT sur le champs id_cat -> id et en précisant qu'à la suppression d'un enregistrement de CAT il faut effacer les enregistrements de LINK.
 
C'est une fonction standard, il faut que les tables soit sur le moteur InnoDB et mettre la clé étrangère en mode ON DELETE CASCADE (recherche la syntaxe je ne la connais pas de tête), ce qui fait que si tu efface un enregistrement dans CAT, MYSQL va effacer tous les "enfants" de cet enregistrement par cascade...  
 
Tu as aussi l'option RESTRICT qui t'interdit de supprimer un enregistrement qui aurai des enfants, SET NULL qui change à NULL les id_cat des enfants orphelins après suppression et NO ACTION dont le sens m'échappe un peu.
 
Ces options sont possibles aussi avec un UPDATE qui ne supprimerai pas ton enregistrement mais le modifierai simplement.
 
voir http://dev.mysql.com/doc/refman/5. [...] aints.html


Message édité par uncle buzz le 17-04-2008 à 11:54:26
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed