C'est ce qu'on appelle le problème de la "table de mutation". Cela revient à dire qu'un déclencheur de ligne n'est pas autorisé à accéder à d'autres lignes dans la même table car il n'y a aucune garantie que les lignes seront mises à jour dans un ordre spécifique, entre autres choses.
Tout d'abord, vous ne devriez vraiment pas essayer de stocker revenu_total alors que vous pouvez le calculer facilement en cas de besoin. Cela dit, je pense que vous pouvez faire ce que vous voulez en faisant quelque chose comme
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;
L'idée est de modifier student.total_income
par rapport à sa valeur précédente, puisque vous ne pouvez référencer que family.income
par rapport à sa valeur précédente.