Je travaille sur un projet de base de données sur le système électoral national. Tout en casting, vote pour un certain candidat, je souhaite mettre à jour automatiquement TOTAL_VOTES +1 dans la table des résultats. Le total_votes de tous les candidats est initié à zéro. J'ai écrit une gâchette, mais cela ne fonctionne pas / je veux que la gâchette fonctionne em> / p> p> p>
3 Réponses :
Essayez ceci, il devrait fonctionner
CREATE OR REPLACE TRIGGER tvc AFTER INSERT ON cast_vote REFERENCING NEW AS newRow OLD AS oldRow FOR EACH ROW DECLARE initialcnt number; BEGIN SELECT COUNT(*) INTO initialcnt FROM results; IF(initialcnt=0) THEN INSERT INTO results VALUES(:newRow.can_id,1); ELSE UPDATE results SET total_vote =(select max(total_vote) from results where can_id=:newRow.can_id)+1 where can_id=:newRow.can_id; END tvc;
Initialement, il n'y a pas de lignes dans les résultats test: p>
Si "total_votes de tous les candidats est initié à zéro" signifie qu'il y a une ligne pour chaque candidat avec un vote 0 Tally défini initialement alors les œuvres suivantes (presque ce que vous aviez): 1. Supprimer le déclarer, il inutile, ou inverse-le et "pour chaque rangée".
2. Changer: OLD.CAN_ID = R.CAN_ID; à: new.can_id = r.can_id; Dans un déclencheur d'insertion: Vieux n'existe pas (vous pouvez le faire référence, mais toutes les colonnes sont nuls).
S'il est possible que le total des votes ne soit pas initialisé, utilisez la fusion.
create or replace Trigger tvc before insert on cast_vote for each row begin merge into results r using (select :new.can_id newid from dual) on (newid = r.id) when matched then update set total_vote = total_vote+1 when not matched then insert (id,total_vote) values(newid,1); end tvc;