Jest to tak zwany problem „tabeli mutacji”. Sprowadza się to do tego, że wyzwalacz wiersza nie ma dostępu do innych wierszy w tej samej tabeli, ponieważ nie ma gwarancji, że wiersze zostaną zaktualizowane między innymi w określonej kolejności.
Po pierwsze, naprawdę nie powinieneś próbować przechowywać total_income, skoro możesz go łatwo obliczyć w razie potrzeby. To powiedziawszy, myślę, że możesz robić, co chcesz, robiąc coś takiego
CREATE TRIGGER family_income_update
AFTER UPDATE ON family
FOR EACH ROW
BEGIN
UPDATE student
SET total_income = total_income + (NEW.income - OLD.income)
WHERE student.id_student = NEW.id_student;
END;
Pomysł polega na zmodyfikowaniu student.total_income
względem jego poprzedniej wartości, ponieważ możesz odwoływać się tylko do family.income
względem jego poprzedniej wartości.