MySQL触发器初试:当A表插入新记录,自动在B表中插入相同ID的记录

今天第一次用MySQL的触发器,怕忘了,赶紧写篇博客记录一下。

废话不说,先上语法:

1 CREATE TRIGGER trigger_name
2 { BEFORE | AFTER } { INSERT | UPDATE | DELETE }
3 ON tbl_name
4 FOR EACH ROW
5 trigger_body

事情的起因是这样的:我有一个人员信息表 pers。因为字段很多,就把中文字段单出来,另建了一个表 perscn。我希望当 pers 插入一条记录,perscn 也能自动插入一条记录,这样就能保证两张表的记录一一对应。MySQL中的触发器正好满足这个需求。不过也是研究了半天才最终搞定。

先上代码:

1 CREATE TRIGGER t_pers_perscn
2 AFTER INSERT ON pers
3 FOR EACH ROW
4 INSERT INTO perscn(pid, sname, oname, unic) VALUES(
5 (SELECT MAX(pid) FROM pers),
6 (SELECT sname FROM pers ORDER BY pid DESC LIMIT 1),
7 (SELECT oname FROM pers ORDER BY pid DESC LIMIT 1),
8 (SELECT unic FROM pers ORDER BY pid DESC LIMIT 1)
9 );

以上代码大致是说:

1 创建触发器 t_pers_perscn
2 在 pers 插入新记录之后
3 对于每一条记录
4 往 perscn 插入一条记录,包含 4 个字段,值分别是(
5 (pid),
6 (sname),
7 (oname),
8 (unic)
9 );

因为需要获取 pers 表中插入记录的 ID(本表中字段名为 pid),一开始想着用 LAST_INSERT_ID(),行不通。后来想到 MAX(),倒是能获得最新插入的 pid 值,但 perscn 中的其它值却不能用 SELECT sname FROM pers WHERE pid = MAX(pid); 来获取,看来在 WHERE 语句中是不能用 MAX() 函数吧…… 最后只能用笨办法,先对 pid 进行降序排列,然后用 LIMIT 限制 1 条记录,这样倒是也能获得与 MAX() 函数相同的效果。没办法,就是这么笨……

回到最上面的语法,大致意思是:

1 CREATE TRIGGER 触发器名称
2 在 INSERT、UPDATE或DELETE动作之前或之后
3 ON 上述动作所作用的表
4 FOR EACH ROW(规定语句,照抄吧)
5 以上动作所触发的SQL语句(即正常SQL操作语句)

其中,第5步的 trigger_body 一般只能写一行。如果有多条操作语句,则需要先用 DELIMITER 暂时更改下语句结束符,然后用 BEGIN...END... 语句来写操作语句(因为BEGIN...END...里必须用半角分号 “;” 来标识一行语句的结束,所以才需要用 DELIMITER)。关于更改 DELIMITER,请见官方文档的示例:

1 mysql> delimiter //
2 mysql> CREATE PROCEDURE dorepeat(p1 INT)
3     -> BEGIN
4     ->   SET @x = 0;
5     ->   REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
6     -> END
7     -> //
8 Query OK, 0 rows affected (0.00 sec)
9 mysql> delimiter ;

触发器真是个好东西,自动化的神器啊…… 改天好好再研究研究、发掘发掘~~~

时间: 2024-10-14 22:13:37

MySQL触发器初试:当A表插入新记录,自动在B表中插入相同ID的记录的相关文章

MySQL判断字段值来确定是否插入新记录

今天正好有个新需求,要求在一张表中,保证不插入重复的记录. 即,保证每条记录中的某个字段的值不重复. 下面是我给出的SQL语句: // 判断表中现有字段3的值是否与新插入记录的字段3的值相同,如果不同则插入新数据. INSERT INTO 表名称 (字段1, 字段2, 字段3) SELECT 插入值1, 插入值2, 插入值3 FROM DUAL WHERE NOT EXISTS ( SELECT * FROM 表名称 WHERE 表名称.字段3 = 插入值3) 如果 "表.校验字段"

设置mysql数据表列自动递增以及数据行插入操作

创建mysql数据表,设置id列递增.主键create table running_log ( id int primary key auto_increment, routename varchar(255), log varchar(255), time datetime ); 往有递增数据列的数据表插入新的数据行 1.INSERT INTO `running_log` (`id`, `routename`, `log`, `time`) VALUES ('null', 'yunnan-10

SQL语句 在一个表中插入新字段

SQL语句 在一个表中插入新字段: alter table 表名 add 字段名 字段类型 例: alter table OpenCourses add Audio varchar(50)alter table ListenCourses add Audio varchar(50)

mysql触发器与存储过程

外键 外键:foreign key,(键不在自己表中):如果一张表中有一个字段(非主键)指向另外一张表的主键,那么将该字段称之为外键. 增加外键 外键可以在创建表时候,或者创建表之后增加.(但是要考虑数据的问题),一张表可以有多个外键. 创建表的时候增加外键 -- 在所有的表字段之后,使用foreign key(外键字段) references 外部表(主键字段) 下面为之前的my_class表(表结构如下图)增加一个外键 create table my_foreignone( id int p

(转) 如何向SQL Server 2005中插入中文

如何向SQL Server 2005中插入中文? 向SQL Server 2005中插入中文数据后,查询出来的结果是???,根本就不显示中文 解决方法: 1 关于数据库排序规则,将SQL_Latin1_General_CP1_CI_AS改成Chinese_PRC_CI_AS ,看一下是否可以解决这个问题,可惜我不能直接操作数据库,测试不了! 修改数据库的排序规则命令: alter   database   [databasename]  COLLATE   Chinese_PRC_CI_AS 2

mysql触发器-表数据实时同步

今天遇到一个需求,是同一个实例里面的两个库中的几张表需要做单向同步,刚开始想直接使用Otter&Canal的架构去做同步.但是因为这个架构依赖的是binlog进行同步的,但是阿里云RDS对于binlog是有做定时清理操作的.所以如果用canal去通过binlog同步的话 一旦RDS的binlog 清理了 将无法同步,并且无法找回之前的数据.所以考虑到只是同步极少数的表,就用了mysql的触发器. mysql的触发器只支持行级触发器不支持语句级触发器,行级触发器又分为单行触发器以及多行触发器. 单

MYSQL,触发器,实现多个表共用ID不重复

参考:https://my.oschina.net/jiuxiaoyao/blog/839266 MYSQL 没有sequence SET @@auto_increment_offsetSET @@auto_increment_increment 也只能在当前查询有效.所以这也是权宜之计 DROP TRIGGER IF EXISTS `InsertUser`; create trigger InsertUser before insert on userinfo for each row Beg

sql server触发器实现插入时操作另一张表

以前都是也得mysql,现在写sqlserver的触发器,感觉改动还是蛮大的 1.定义变量 #在mysql中变量直接这么定义就可以了 SET @VALUE = "111"; #在sql server中 declare @count int; #并赋值 set @count =0; #如果是查询,必须这么些 select @count = count(*) from WQ_MNINF_D_REAL where [email protected]; 2.判断 在mysql中,if判断的格式

MySQL创建临时表-旧表建新表

1.创建临时表 临时表是一张表,用来临时保存一些数据 特点: 只对创建该临时表的用户可见: 当会话结束时,MySQL自动删除临时表. 临时表的核心:建表和删表消耗资源极其少 创建临时表的基本格式: CREATE TEMPORARY TABLE  tbl_name(--); ①创建的临时表在当前会话,正常使用 ②断开连接,再重新连接后执行查询,抛出异常: 错误代码: 1146 Table 'db_name.temtbl_name' doesn't exist.//该临时表在会话结束的时候被系统删除