trigger - Activador de MySQL en eventos de inserción/actualización
trigger mysql insert (2)
Entonces tengo dos mesas como esta ...
ext_words
-------------
| id | word |
-------------
| 1 | this |
-------------
| 2 | that |
-------------
| 3 | this |
-------------
ext_words_count
---------------------
| id | word | count |
---------------------
| 1 | this | 2 |
---------------------
| 2 | that | 1 |
---------------------
Estoy tratando de crear un disparador que:
- actualice
ext_words_count.count
cuandoext_words.word
esté actualizado.
Para complicar aún más las cosas,
- si
ext_words.word
no existe enext_words_count
cuandoext_words
está actualizado, me gustaría insertarlo enext_words_count
y configurar elcount
como 1.
He estado viendo preguntas similares:
1. Disparador de inserción antes / después usando el campo de incremento automático , y
2. Usando Trigger para actualizar la tabla en otra base de datos
tratando de combinar el 2. Esto es lo que tengo hasta ahora:
DELIMITER $$
CREATE TRIGGER update_count
AFTER UPDATE ON ext_words
FOR EACH ROW
BEGIN
UPDATE ext_words_count
SET word_count = word_count + 1
WHERE word = NEW.word;
END;
$$
DELIMITER ;
Cualquier consejo y dirección es muy apreciado. O posiblemente otro método que he pasado por alto y como siempre ¡gracias de antemano!
ACTUALIZAR:
He optado por utilizar 2 disparadores, uno para INSERT y otro para UPDATE porque no estoy tan familiarizado con las declaraciones condicionales en MySQL.
DELIMITER $$
CREATE TRIGGER insert_word AFTER INSERT ON ext_words
FOR EACH ROW
BEGIN
INSERT IGNORE INTO ext_words_count (word) VALUES (NEW.word);
END;
$$
DELIMITER ;
y
DELIMITER $$
CREATE TRIGGER update_word AFTER UPDATE ON ext_words
FOR EACH ROW
BEGIN
UPDATE ext_words_count
SET word_count = word_count + 1
WHERE word = NEW.word;
END;
$$
DELIMITER ;
La consulta INSERT funciona bien, sin embargo, la consulta UPDATE no actualiza word_count
. ¿Hay algo que omití en la consulta de actualización ...?
Con la ayuda perfecta de Grijesh y su sugerencia de usar declaraciones condicionales, pude obtener UN gatillo que realiza ambas tareas. Gracias otra vez Grijesh
DELIMITER $$
CREATE TRIGGER update_count AFTER INSERT ON ext_words
FOR EACH ROW
BEGIN
IF NOT EXISTS (SELECT 1 FROM ext_words_count WHERE word = NEW.word) THEN
INSERT INTO ext_words_count (word) VALUES (NEW.word);
ELSE
UPDATE ext_words_count SET word_count = word_count + 1 WHERE word = NEW.word;
END IF;
END $$
DELIMITER;
evite el uso de palabras clave como count, ya que es usado por el método sql, en algún momento se crea un error, pero algunas se ejecutan bien
DELIMITER $$
CREATE TRIGGER update_count
AFTER UPDATE ON ext_words
FOR EACH ROW
BEGIN
SELECT count INTO @x FROM ext_words_count LIMIT 1;
UPDATE ext_words_count
SET count = @x + 1
WHERE word = NEW.word;
END;
$$
DELIMITER ;