Как запрограммировать триггер MySQL для вставки строки в другую таблицу? - PullRequest
29 голосов
/ 21 января 2011

Я хочу создать триггер MySQL для таблицы. По сути, я создаю поток активности и должен регистрировать действия пользователей. Когда пользователь делает комментарий, я хочу, чтобы триггер базы данных на этой таблице сработал и:

  1. Получить идентификатор последней вставленной строки (идентификатор строки комментария).
  2. выполнить INSERT в таблице действий, используя данные из последней вставленной строки.

По сути, я скопирую этот триггер для удаления комментариев.

Вопросы, которые у меня были:

  1. Является ли LAST_INSERT_ID () лучшим способом получения идентификатора?
  2. Как правильно сохранить данные из последней вставленной строки комментария для использования в моем операторе "INSERT into активность"?
  3. Должен ли я использовать комбинацию хранимых процедур и триггер?
  4. Как будет выглядеть основная структура триггера?

Спасибо! Прошло несколько лет с тех пор, как я коснулся всего, что касается триггеров, процедур и функций БД.

1 Ответ

42 голосов
/ 21 января 2011
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)
...