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

Posted

技术标签:

【中文标题】如何编写 MySQL 触发器以将行插入另一个表?【英文标题】:How to program a MySQL trigger to insert row into another table? 【发布时间】:2011-06-12 20:06:26 【问题描述】:

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

    获取最后插入行的 ID(评论行的 ID)。 使用最后插入的行中的数据对活动表执行 INSERT。

我基本上会复制这个触发器来删除 cmets。

我的问题:

    LAST_INSERT_ID() 是获取 id 的最佳方式吗? 如何正确存储最后插入的评论行中的数据以用于我的“INSERT into activities”语句? 我应该同时使用存储过程和触发器吗? 触发器的基本结构是什么样的?

谢谢!自从我接触到与 DB 触发器、过程和函数有关的任何东西以来,已经有好几年了。

【问题讨论】:

【参考方案1】:
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)

【讨论】:

对于所有想知道这里的“新”代表什么的人:您可以使用别名 OLD 和 NEW 来引用主题表(与触发器关联的表)中的列。 OLD.col_name 在更新或删除之前引用现有行的列。 NEW.col_name 指的是要插入的新行的列或更新后的现有行。 dev.mysql.com/doc/refman/5.0/en///create-trigger.html @f00,你能在这个触发器中告诉我......因为有一个子句for each row 会扫描整个表,还是只插入新行。感谢您的帮助 @SAM, "for each row" 根据 mysql 文档仅考虑更新/插入的行。 为什么会出现这个错误? #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 mysql phpmyadmin 的第 7 行的“插入 cmets (user_id) 值 (1),(2)”附近使用正确的语法 @www.amitpatil.me 如果我没记错的话 phpmyadmin 不喜欢分隔符; --script 在 mysql 控制台中运行良好。

以上是关于如何编写 MySQL 触发器以将行插入另一个表?的主要内容,如果未能解决你的问题,请参考以下文章

H2 - 如何创建将行更改记录到另一个表的数据库触发器?

调用触发器时将行从一个表复制到另一个表

将行从一个链接表插入到另一个链接表

删除触发器以将条目插入表中

创建触发器以将数据从一个表获取到另一个表并生成时间戳

从第 1 行开始将行从一个表插入到另一个表?