2011-01-20 17 views
24

Sto cercando di creare un trigger MySQL su un tavolo. In sostanza, sto creando un flusso di attività e ho bisogno di registrare le azioni degli utenti. Quando un utente fa un commento, desidero attivare un trigger di database su tale tabella:Come programmare un trigger MySQL per inserire una riga in un'altra tabella?

  1. Prendere l'ID dell'ultima riga inserita (l'ID della riga di commento).
  2. esegue un INSERT in una tabella di attività, utilizzando i dati dell'ultima riga inserita.

In pratica eseguirò la replica di questo trigger per l'eliminazione dei commenti.

domande che avevo:

  1. LAST_INSERT_ID() è il modo migliore per afferrare l'id?
  2. Come archiviare correttamente i dati dell'ultima riga di commenti inserita per l'utilizzo nella mia istruzione "INSERIRE in attività"?
  3. Devo utilizzare una combinazione di stored procedure e trigger?
  4. Come si presenta la struttura di base del trigger?

Grazie! Sono passati alcuni anni da quando ho toccato qualcosa da fare con i trigger, le procedure e le funzioni di DB.

risposta

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; 

Edit:

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

Per tutto chiedendo cosa la "nuova" qui è in piedi per: _You può fare riferimento alle colonne della tabella soggetto (la tabella associata con il grilletto) utilizzando gli alias OLD e NEW. OLD.col_name fa riferimento a una colonna di una riga esistente prima che venga aggiornata o eliminata. NEW.col_name fa riferimento alla colonna di una nuova riga da inserire o a una riga esistente dopo l'aggiornamento._ http://dev.mysql.com/doc/refman/5.0/en///create-trigger.html – SimonSimCity

+0

@ f00, puoi dirmi in questo trigger ... poiché c'è una clausola 'per ogni riga' eseguirà la scansione di una tabella intera, o inserirà solo nuove righe. Grazie per l'aiuto – SAM

+1

@ SAME, "per ogni riga" considera solo le righe aggiornate/inserite in base alla documentazione di mysql. –