如何编写MySQL触发器以将行插入另一张表?

35

我想在一个表上创建一个MySQL触发器。本质上,我正在创建一个活动流并需要记录用户的操作。当用户发表评论时,我希望在该表上使用数据库触发器并执行以下操作:

  1. 获取插入的最后一行的ID(即评论行的ID)。
  2. 使用来自插入的最后一行的数据执行INSERT语句到活动表中。

我将为删除评论复制此触发器。

我有以下问题:

  1. LAST_INSERT_ID()是获取id的最佳方法吗?
  2. 如何正确存储来自最后插入的评论行的数据以供“INSERT into activities”语句使用?
  3. 是否应该同时使用存储过程和触发器?
  4. 触发器的基本结构是什么样的?

谢谢!几年来我没接触过与DB触发器、存储过程和函数有关的内容。

1个回答

50
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;

编辑:

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)

15
如果你想知道这里的“新”代表什么:通过使用别名OLD和NEW,您可以引用主题表中的列(与触发器相关联的表)。OLD.col_name指的是更新或删除之前现有行的列。NEW.col_name指的是要插入的新行或更新后的现有行的列。请参考:http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html - SimonSimCity
@f00,请问在这个触发器中,由于有一个“for each row”的子句,它会扫描整个表格,还是只会插入新行。感谢您的帮助。 - SAM
1
@SAM,“for each row”仅考虑根据MySQL文档更新/插入的行。 - Bojan Hrnkas
为什么我会得到这个错误?#1064 - 您在 SQL 语法中有一个错误;请检查与您的 MySQL 服务器版本对应的手册,以了解在第7行使用正确的语法,即'insert into comments (user_id) values (1),(2)'。在 MySQL phpMyAdmin 上。 - www.amitpatil.me
1
如果我没记错的话,phpmyadmin不喜欢分隔符“;”,但是在mysql控制台中脚本可以正常运行。@www.amitpatil.me - Jon Black
当我尝试使用“.”访问列名时,它无法工作。 - Muhammad Younas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接