OLD es una
pseudovariable, no una
variable. Es una referencia temporal al registro preexistente, y sólo existe para los TRIGGERS definidos para UPDATE o DELETE. En ese sentido, es una referencia que apunta a un registro físico, y sus únicos valores se corresponden con los mismos campos que componen a la tabla, pero sólo para ese registro.
Incluso, para ser específico, en tu caso sólo podrías
intentar lo que quieres en el caso de un TRIGGER definido para AFTER UPDATE, ya que requieres que la evaluación del dato se realice
antes de que sea eliminado.
No hace falta probar la existencia de OLD, porque se trata de una estructura interna definida por MySQL, y por tanto
siempre existe dentro de su ambiente.
Cita: tambien quisiera saber si en una sentencia update existe los datos OLD solo si se modifica y es distinta?
OLD y NEW como pseudovariables
sólo existen en el contexto de un TRIGGER, nada más, lo que significa que no pueden ser invocados en una consulta fuera del trigger de ninguna forma.
Ahora bien, en tu caso (restar el valor nuevo si existe un valor en el registro de la tabla) no necesariamente requiere que se haga en un TRIGGER. Bien se podría hacer en la propia sentencia de UPDATE, bien redactada:
Esto es especialmente conveniente si el proceso que quieres poner en el TRIGGER es opcional, porque (no te olvides) los TRIGGERS se ejecutan en todas y cada una de las ocasiones en que el evento controlado se produzca. Siempre.
Si tu resta no se debe verificar
todas las veces, si al menos hay una ocasión en que no se deba hacer, entonces no es correcto usar un TRIGGER para implementarla.
Los TRIGGERS son cosa que hay que manejar con precaución, y sólo si son estrictamente necesarios, porque suman carga al proceso servidor. Si los pones donde no se necesitan, o donde se pueda hacer de otra forma, afectas inútilmente la performance del sistema.