Blog de informática: programación, internet, php, wordpress, zend framework, mysql, windows, mootools, linux,…
In: mysql
9 ago 2009
Como vimos en la entrada anterior, creamos una stored procedure 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:
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
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:
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.