zoukankan      html  css  js  c++  java
  • 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 ;

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

  • 相关阅读:
    gdb remote 使用
    gdb调试的layout使用
    经典名言--教父
    GDB dump mem example和命令
    再谈音响的七个频段,个个是真理
    Ubuntu 16.04下GDB调试
    shell脚本中if的“-e,-d,-f”
    ubuntu下makeinfo安装,其实真正安装的是texinfo包
    【svn】svn的使用
    【linux】监控磁盘情况并自动删除备份文件
  • 原文地址:https://www.cnblogs.com/iderek/p/6802351.html
Copyright © 2011-2022 走看看