2010-03-24 5 views
0

J'ai ce morceau de logique que je voudrais mettre en œuvre comme un déclencheur, mais je n'ai aucune idée de comment le faire! Je veux créer un déclencheur qui, lorsqu'une ligne est supprimée, vérifie si la valeur d'une de ses colonnes existe dans une autre table, et si c'est le cas, elle doit également effectuer une suppression sur une autre table basée sur une autre colonne. Donc disons que nous avions une table Foo qui a des colonnes Bar, Baz. Voici ce que id être fait si je n'ai pas utilisé un déclencheur:boucles et conditionnels à l'intérieur des déclencheurs

function deleteFromFooTable(FooId) 
{ 
    SELECT (Bar,Baz) FROM FooTable WHERE id=FooId 
    if not-empty(SELECT * FROM BazTable WHERE id=BazId) 
    DELETE FROM BarTable WHERE id=BarId 

    DELETE FROM FooTable WHERE id=FooId 

} 

je sautais des cerceaux dans ce code de pseudo, mais j'espère que vous obtenez tous où aller im. Il semble que ce dont j'ai besoin est un moyen de faire des conditionnelles et de boucler (dans le cas de suppressions de plusieurs lignes?) Dans l'instruction trigger. Jusqu'à présent, je n'ai rien trouvé. Est-ce impossible ou est-ce une mauvaise pratique? Merci!

Répondre

2

Si vous n'avez pas configuré les relations de clé étrangère entre ces tables, vous devez le faire. Je vais vous montrer la commande pour configurer ce que vous voulez quand vous créez la table. Clairement, vous aurez juste besoin de mettre à jour la table.

CREATE TABLE foo (id INT, bar_id INT, 
    FOREIGN KEY (bar_id) REFERENCES bar(id) 
     ON DELETE CASCADE 
) ENGINE=INNODB; 

Ceci supprimera tous les "orphelins" lorsqu'un enregistrement Foo est supprimé.

+0

merci kevin, cela fait presque ce que j'ai besoin, sauf si je l'efface dépend si elle est référencée par une autre table. Comment ferais-je cela? – Ying

+0

@Ying C'est ce que cela devrait faire. Il ne supprimera que quelque chose s'il n'est pas référencé par une autre table. –

Questions connexes