Ok, si vous voulez vraiment le déclencheur lors de la mise à jour, ce que vous pouvez faire, c'est définir ce déclencheur comme spécifique à une colonne, afin qu'il ne soit pas déclenché lors d'une mise à jour de all_books
, ce qui provoque votre récursivité. Quelque chose comme ça -
create trigger total2
after update of copy_id
on totalbooks
for each row
execute procedure total1();
Bien sûr, vous pouvez changer les colonnes qui déclenchent la fonction, j'ai juste choisi copy_id
parce que c'est ce que vous comptez.
CEPENDANT
Si vous mettez à jour avec un count()
résultat, vous pouvez simplement mettre le déclencheur sur INSERT
et DELETE
Actions. De cette façon, le déclencheur se déclenchera lorsque le nombre changera, mais ne sera pas lui-même déclenché par la mise à jour. // EDIT :Depuis votre sum
n'est qu'un décompte de tous les enregistrements en copies
, il ne changera que lorsqu'un enregistrement est inséré ou mis à jour, donc exécuter ce déclencheur lors de la mise à jour n'aurait aucun sens de toute façon.
EDIT :j'ai pensé qu'il serait utile d'ajouter un lien vers le CREATE Documentation DÉCLENCHEUR . Consultez la section intitulée "événement", car elle détaille comment spécifier des colonnes dans l'événement.
MODIFIER POUR NOUVELLES INFORMATIONS :
Compte tenu de ce que vous semblez devoir accomplir, je pense que vous devez repenser la conception de vos données, je vous suggère d'utiliser une relation parent-enfant (chaque fois que vous mettez en cache des données partagées sur plusieurs lignes d'une table parce qu'elles partagent quelque chose en commun, cela est un signe que vous pourriez avoir besoin d'une table parent à la place).
Avoir un books
tableau où chaque ligne contient des informations sur un livre (titre, auteur, etc.), puis contient un copies
table où chaque ligne contient des informations sur un exemplaire d'un livre (numéro de série, dernier extrait, etc.).
De cette façon, obtenir le nombre de copies est aussi simple que SELECT COUNT(*) FROM copies WHERE book_id=[some book id]
.
Si vous voulez vraiment mettre le décompte en cache quelque part, faites-le sur les books
table.
Créer un INSERT OR UPDATE
déclencheur sur les copies
qui fait UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=NEW.book_id) WHERE id=NEW.book_id
.
Créez ensuite un DELETE
déclencheur sur les copies qui effectue UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=OLD.book_id) WHERE id=OLD.book_id
La raison de deux déclencheurs est que le NEW
la variable n'est disponible que dans INSERT
ou UPDATE
déclencheurs et OLD
n'est disponible que dans DELETE
déclencheurs. Vous pouvez tout faire en un seul déclencheur, mais cela nécessite plus de code que je ne voulais en mettre ici.
Assurez-vous que tous vos déclencheurs sont AFTER
déclencheurs, sinon une ligne nouvellement insérée/supprimée ne sera pas prise en compte dans le décompte.