Det här är vad som kallas "muterande tabell"-problemet. Vad det handlar om är att en radutlösare inte tillåts komma åt andra rader i samma tabell eftersom det inte finns någon garanti för att raderna kommer att uppdateras i en specifik ordning, bland annat.
För det första, du borde verkligen inte försöka lagra total_income när du kan beräkna det enkelt när det behövs. Som sagt, jag tror att du kan göra vad du vill genom att göra något liknande
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;
Tanken är att ändra student.total_income
i förhållande till dess tidigare värde, eftersom du bara kan referera till family.income
i förhållande till dess tidigare värde.