Dies ist das sogenannte „Mutating Table“-Problem. Es läuft darauf hinaus, dass ein Zeilentrigger nicht auf andere Zeilen in derselben Tabelle zugreifen darf, weil es unter anderem keine Garantie dafür gibt, dass Zeilen in einer bestimmten Reihenfolge aktualisiert werden.
Zunächst einmal sollten Sie wirklich nicht versuchen, total_income zu speichern, wenn Sie es bei Bedarf einfach berechnen können. Abgesehen davon denke ich, dass Sie tun können, was Sie wollen, indem Sie so etwas wie
tunCREATE 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;
Die Idee ist, student.total_income
zu ändern relativ zu seinem vorherigen Wert, da Sie nur family.income
referenzieren können relativ zu seinem vorherigen Wert.