Disparadores de MySQL (triggers)

Guardar este artículo en Delicious Compartir este artículo en Twitter Compartir este artículo en Facebook

A partir de la versión 5.0.2, MySQL incorpora disparadores, o como lo llaman los angloparlantes y los entendidos del tema ‘triggers’. Se trata de un objeto de base de datos asociado a una tabla que se activa cuando se produce un evento previamente especificado en la tabla indicada (hasta el momento los eventos válidos son INSERT, UPDATE y DELETE). Estos objetos eran ya habituales en otros sistemas de base de datos, y MySQL los implementó entre otras cosas por petición popular. La verdad es que estos disparadores pueden ahorrarnos trabajo y líneas de código. El ejemplo más claro que se me ocurre es con los comentarios:

Imagina que tienes una tabla de comentarios asociada a una tabla de posts, y por cada fila de esa tabla de posts tienes un campo dónde guardas el número de comentarios hechos en cada post. Cada vez que se inserta un comentario tienes que actualizar ese campo, y si no usas triggers deberás hacerlo con PHP y una nueva consulta a la BD. En cambio, te puedes ahorrar un poco de trabajo si creas un disparador que se active cada vez que se inserta una línea en la tabla de comentarios y que actualize ese campo en la tabla posts con el total de comentarios. Vamos a ver como hacerlo.

La sintaxis para crear un disparador en MySQL es la siguiente:
CREATE TRIGGER nombre_disp {BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON nombre_tabla FOR EACH ROW sentencia_disp
La sintaxis para borrarlo es:
DROP TRIGGER nombre_disp
Dentro de la consulta, si se quiere hacer referencia a algún campo de la tabla a la que se refiere el disparador, habrá que especificar si hablamos del campo antes de producirse el evento o después usando ‘NEW.’ o ‘OLD.’ como nombre de tabla.
Para más info sobre la sintaxis consultar el manual de MySQL.

Entonces para el ejemplo escogido y suponiendo que la tabla de posts se llama ‘post_table’ y la de comentarios ‘comment_table’, la consulta para crear el disparador sería la siguiente:
DELIMITER |
CREATE TRIGGER automatic_post_count AFTER INSERT ON comment_table FOR EACH ROW BEGIN
UPDATE post_table SET comment_count = ( SELECT COUNT(comment_table.ID) FROM comment_table WHERE comment_table.post_id = NEW.post_id ) WHERE id = NEW.post_id;
END|
DELIMITER ;

El comando ‘DELIMITER’ lo hemos usado porque al ser la sentencia bastante larga y tener subconsultas que deben tener un caracter para finalizar (;), debemos marcar cuando acaba la consulta completa. Entonces al principio cambiamos el delimitador habitual (;) por el pipe (|) y luego lo dejamos como estaba. Por esta misma razón puede que te dé problemas al ejecutar la consulta desde el phpMyAdmin, por eso lo mejor es que lo hagas desde consola o metiendo la consulta en un fichero de texto plano e importarlo mediante phpMyAdmin.

Este es un ejemplo sencillo de como usar los disparadores, pero es aplicable a muchas otras cosas, y ésta no tiene porque ser la mejor.

2 Comentarios
  1. jeison999

    uoo esto si que es bueno yo lo usaba para contar con php. me suscribo ya

  2. pedro anguiano sarmiento

    todo esto que viene en estas paginas no me parece completo pero puede mejorar

Deja un comentario