Procedure de estadísticas que haga un INSERT o un UPDATE (I)

In: mysql

8 ago 2009

MySQL Stored Procedure Programming1 Procedure de estadísticas que haga un INSERT o un UPDATE (I)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:

  • Si no existen estadísticas sobre este registro, se tiene que crear el registro en la tabla de estadísticas con un INSERT
  • Si ya existen estadísticas, se tiene que incremenetar el valor del registro de la tabla de estadísticas con un UPDATE

Hay tres opciones a la hora de programar el sistema que incremente las estadísticas en MySQL:

  • Se hace una consulta a la Base de Datos con un SELECT, para saber si ya existe el registro o no en la tabla de estadísticas. Si no existe, hacemos otra petición a la Base de Datos haciendo un INSERT, y si existe, la petición será un UPDATE. En resumen, dos peticiones a la Base de Datos, con una operación cada una.
  • Se puede programar una STORED PROCEDURE que reciba el registro de las estadísticas. La Procedure se encarga de comprobar que exista el registro o no con un SELECT, y dependiendo del caso, hará la operación pertinente. En resumen, una petición a la Base de Datos, que al final ejecutará dos operaciones.
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
  • Igual que el anterior, pero directamente hacer el INSERT … ON DUPLICATE KEY UPDATE, y que él mismo detecte a traves de un índice UNIQUE que ya existe el registro, y entonces lo incremente. En resumen, una petición a la Base de Datos, y una operación, pero es necesario un índice UNIQUE que puede ser la PRIMARY KEY de la tabla si nos sirve.
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:

  1. Procedure de estadísticas que haga un INSERT o un UPDATE (II)

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.

Formulario de Comentario

Página 1 de 0

Sobre este blog

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.