2011-01-20 29 views
24

Estoy buscando crear un disparador de MySQL en una tabla. Básicamente, estoy creando una secuencia de actividad y necesito registrar acciones de los usuarios. Cuando un usuario hace un comentario, quiero que se active un disparador de base de datos en esa tabla y:¿Cómo programar un disparador de MySQL para insertar una fila en otra tabla?

  1. Obtenga el ID de la última fila insertada (la identificación de la fila de comentarios).
  2. realiza un INSERTAR en una tabla de actividades, utilizando los datos de la última fila insertada.

Básicamente, reproduciré este disparador para eliminar comentarios.

preguntas que tenía:

  1. Es LAST_INSERT_ID() la mejor manera de captar la identificación?
  2. ¿Cómo almaceno adecuadamente los datos de la última fila de comentarios insertados para usar en mi declaración "INSERTAR en actividades"?
  3. ¿Debo utilizar una combinación de procedimientos almacenados, así como el disparador?
  4. ¿Cómo sería la estructura básica del gatillo?

¡Gracias! Han pasado algunos años desde que toqué algo relacionado con desencadenantes DB, procedimientos y funciones.

Respuesta

36
drop table if exists comments; 
create table comments 
(
comment_id int unsigned not null auto_increment primary key, 
user_id int unsigned not null 
) 
engine=innodb; 

drop table if exists activities; 
create table activities 
(
activity_id int unsigned not null auto_increment primary key, 
comment_id int unsigned not null, 
user_id int unsigned not null 
) 
engine=innodb; 

delimiter # 

create trigger comments_after_ins_trig after insert on comments 
for each row 
begin 
    insert into activities (comment_id, user_id) values (new.comment_id, new.user_id); 
end# 

delimiter ; 

insert into comments (user_id) values (1),(2); 

select * from comments; 
select * from activities; 

Editar:

mysql> \. d:\foo.sql 

Database changed 
Query OK, 0 rows affected (0.10 sec) 

Query OK, 0 rows affected (0.30 sec) 

Query OK, 0 rows affected (0.11 sec) 

Query OK, 0 rows affected (0.35 sec) 

Query OK, 0 rows affected (0.07 sec) 

Query OK, 2 rows affected (0.03 sec) 
Records: 2 Duplicates: 0 Warnings: 0 

+------------+---------+ 
| comment_id | user_id | 
+------------+---------+ 
|   1 |  1 | 
|   2 |  2 | 
+------------+---------+ 
2 rows in set (0.00 sec) 

+-------------+------------+---------+ 
| activity_id | comment_id | user_id | 
+-------------+------------+---------+ 
|   1 |   1 |  1 | 
|   2 |   2 |  2 | 
+-------------+------------+---------+ 
2 rows in set (0.00 sec) 
+7

Para todos preguntándose lo que el "nuevo" aquí está de pie para: _Usted puede hacer referencia a columnas de la tabla sujeto (la tabla asociada con el gatillo) mediante el uso de los alias VIEJO y NUEVO. OLD.col_name se refiere a una columna de una fila existente antes de que se actualice o elimine. NEW.col_name hace referencia a la columna de una nueva fila que se insertará o una fila existente después de que se actualice._ http://dev.mysql.com/doc/refman/5.0/en///create-trigger.html – SimonSimCity

+0

@ f00, ¿puede decirme por favor en este desencadenante ... como hay una cláusula 'para cada fila' escaneará toda la tabla, o insertará solamente nuevas filas. Gracias por su ayuda – SAM

+1

@SAM, "para cada fila" considera solo las filas actualizadas/insertadas según la documentación de mysql. –

Cuestiones relacionadas