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

In: mysql

9 ago 2009

MySQL Stored Procedure Programming1 Procedure de estadísticas que haga un INSERT o un UPDATE (II)Como vimos en la entrada anterior, creamos una stored para hacer el incremento típico de unas estadísticas.

Pero se puede dar el caso, de que se quieren incremenetar una serie de registros a la vez. Por poner otro ejemplo, tenemos una tabla de tags, donde se almacenan las veces que son asignadas a una entrada. Cuando se crea una entrada, hay que incrementar todas las tags que tiene la entrada asignadas.

A la hora de programarlo, tenemos tres opciones:

  • Por código, se hace una llamada a la por cada tag que tiene la entrada asignada, haciendo tantas llamadas a la como tags asignadas.
  • Modificamos la anterior, para que reciba una cadena de tags con un separador, así la se encarga de ir cortando y cogiendo las tags y incrementandolas.
CREATE PROCEDURE increment_tags (tags VARCHAR(100000))
BEGIN
	DECLARE tag VARCHAR(10);	--Variable donde se irán guardando las tags
 
	WHILE LENGTH(tags)>0 DO
		SET tag = SUBSTRING_INDEX(tags, ',', 1);	--El separador es una coma
		SET tags = SUBSTR (tags, LENGTH(tag)+2);	--La cadena de tags es recortada por el tag actual
		INSERT INTO tbl_tags (tag, ranking) VALUES (tag, 1)
			ON DUPLICATE KEY UPDATE ranking = ranking +1;
	END WHILE;
END
  • Modificar la que va cortando la cadena de tags para que, en vez de incrementar cada vez que coge una tag, haga una cadena de texto que seráuna sentencia preparada, un INSERT con todos las tags a incrementar, y al final la ejecute, consiguiendo una petición a la Base de Datos, y un solo INSERT.
CREATE PROCEDURE increment_tags (tags VARCHAR(100000))
BEGIN
	DECLARE tag VARCHAR(10);	--Variable donde se irán guardando las tags
	DECLARE txt_insert VARCHAR(105000) DEFAULT '';		--Contendrá el INSERT que se va formando
 
	WHILE LENGTH(tags)>0 DO
		SET tag = SUBSTRING_INDEX(tags, ',', 1);
		SET tags = SUBSTR(tags, LENGTH(tag)+2);
		SET txt_insert = CONCAT(txt_insert, ',(', tag, ', 1)');
	END WHILE;
 
	SET @sql = CONCAT('INSERT INTO tags (tag, ranking) VALUES '
					, SUBSTR(txt_insert, 2)
					, ' ON DUPLICATE KEY UPDATE ranking = ranking +1;');
	PREPARE stmt1 FROM @sql;
	EXECUTE stmt1;
	DEALLOCATE PREPARE stmt1;
END

Entradas relacionadas:

  1. Procedure de estadísticas que haga un INSERT o un UPDATE (I)
  2. WordPress y problemas con el módulo ModSecurity de Apache

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.