Questo è ciò che è noto come il problema della "tabella mutante". Ciò a cui si riduce è che un attivatore di riga non può accedere ad altre righe nella stessa tabella perché non vi è alcuna garanzia che le righe vengano aggiornate in un ordine specifico, tra le altre cose.
Prima di tutto, non dovresti davvero cercare di memorizzare total_income quando puoi calcolarlo facilmente quando necessario. Detto questo, penso che tu possa fare quello che vuoi facendo qualcosa come
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'idea è di modificare student.total_income
rispetto al suo valore precedente, poiché puoi fare riferimento solo a family.income
rispetto al suo valore precedente.