Blog de informática: programación, internet, php, wordpress, zend framework, mysql, windows, mootools, linux,…
In: mysql
8 ago 2009
La típica tabla de estadísticas, tiene una serie de registros, donde se almacenan valores que se van incrementando: visitas, votos, puntos, … Para la operación de incrementar las estadísticas, tenemos que contemplar dos casos:
Hay tres opciones a la hora de programar el sistema que incremente las estadísticas en MySQL:
CREATE PROCEDURE `increment_stadistics`( IN uid int ) BEGIN DECLARE is_uid INT; SELECT id INTO is_uid FROM stadistics WHERE id = uid LIMIT 1; IF is_uid IS NULL THEN INSERT INTO stadistics (id, stats) values (uid, 1); ELSE UPDATE stadistics SET stats = stats+1 WHERE id = uid LIMIT 1; END IF; END
CREATE PROCEDURE increment_stadistics ( IN uid int ) BEGIN DECLARE is_uid INT; INSERT INTO stadistics (id, stats) VALUES (uid, 1) ON DUPLICATE KEY UPDATE stats = stats +1; END
El inconveniente de los índices, es que cuando se modifica la tabla (INSERT, UPDATE o DELETE), se han de regenerar. El caso de índice UNIQUE, implica además que antes de hacer un INSERT, tendrá que comprobar que no se dupliquen los registros. Como va a tener que comprobarlo, si no lo encuentra, hace el INSERT, y si lo encuentra, hace el UPDATE automáticamente.
En la siguiente entrada, veremos como modificar la procedure para que haga el incremento de una serie de registros con una sola llamada a la procedure.
Entradas relacionadas:
Este blog informático pretende ser un blog de notas o portafolio de información variada: trozos de código, descubrimientos, notas sueltas, ... Para tenerla a mano, y ser compartida.
3 Comentarios en Procedure de estadísticas que haga un INSERT o un UPDATE (I)
zottoh
30 octubre 2009 a las 11:35
Sólo lo dire una vez en todo el blog…. Buen post!!!!!!
Daniel
30 noviembre 2009 a las 21:16
Buen post, solo queria preguntar algo. ¿En vez de un procedimiento no es mejor crear un disparador (trigger) que se encargue de estas estadísticas?.
Corregidme si me equivoco ya que estoy programando un sistema y puse un trigger que se ejecuta de forma similar que tu procedure.
Saludos
otroblogmas.com
30 noviembre 2009 a las 22:41
@Daniel Si, lo podrías hacer con un trigger, si el evento que dispara el trigger es producido por la base de datos. Pero si el evento es externo, como algo que dependa del servidor web o una petición especial, no podrás hacerlo con un trigger. Tendrás que hacer una procedure que será llamara cuando se produzca el evento a contabilizar.