时间:2021-07-01 10:21:17 帮助过:20人阅读
事情的起因是这样的:我有一个人员信息表 pers。因为字段很多,就把中文字段单出来,另建了一个表 perscn。我希望当 pers 插入一条记录,perscn 也能自动插入一条记录,这样就能保证两张表的记录一一对应。MySQL中的触发器正好满足这个需求。不过也是研究了半天才最终搞定。
先上代码:
- <span style="color: #008080">1</span> <span style="color: #0000ff">CREATE</span> <span style="color: #0000ff">TRIGGER</span><span style="color: #000000"> t_pers_perscn
- </span><span style="color: #008080">2</span> AFTER <span style="color: #0000ff">INSERT</span> <span style="color: #0000ff">ON</span><span style="color: #000000"> pers
- </span><span style="color: #008080">3</span> <span style="color: #0000ff">FOR</span><span style="color: #000000"> EACH ROW
- </span><span style="color: #008080">4</span> <span style="color: #0000ff">INSERT</span> <span style="color: #0000ff">INTO</span> perscn(pid, sname, oname, unic) <span style="color: #0000ff">VALUES</span><span style="color: #000000">(
- </span><span style="color: #008080">5</span> (<span style="color: #0000ff">SELECT</span> <span style="color: #ff00ff">MAX</span>(pid) <span style="color: #0000ff">FROM</span><span style="color: #000000"> pers),
- </span><span style="color: #008080">6</span> (<span style="color: #0000ff">SELECT</span> sname <span style="color: #0000ff">FROM</span> pers <span style="color: #0000ff">ORDER</span> <span style="color: #0000ff">BY</span> pid <span style="color: #0000ff">DESC</span> LIMIT <span style="color: #800000; font-weight: bold">1</span><span style="color: #000000">),
- </span><span style="color: #008080">7</span> (<span style="color: #0000ff">SELECT</span> oname <span style="color: #0000ff">FROM</span> pers <span style="color: #0000ff">ORDER</span> <span style="color: #0000ff">BY</span> pid <span style="color: #0000ff">DESC</span> LIMIT <span style="color: #800000; font-weight: bold">1</span><span style="color: #000000">),
- </span><span style="color: #008080">8</span> (<span style="color: #0000ff">SELECT</span> unic <span style="color: #0000ff">FROM</span> pers <span style="color: #0000ff">ORDER</span> <span style="color: #0000ff">BY</span> pid <span style="color: #0000ff">DESC</span> LIMIT <span style="color: #800000; font-weight: bold">1</span><span style="color: #000000">)
- </span><span style="color: #008080">9</span> );
以上代码大致是说:
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,请见官方文档的示例:
- <span style="color: #008080">1</span> mysql<span style="color: #808080">></span> delimiter <span style="color: #808080">//</span>
- <span style="color: #008080">2</span> mysql<span style="color: #808080">></span> <span style="color: #0000ff">CREATE</span> <span style="color: #0000ff">PROCEDURE</span> dorepeat(p1 <span style="color: #0000ff">INT</span><span style="color: #000000">)
- </span><span style="color: #008080">3</span> <span style="color: #808080">-></span> <span style="color: #0000ff">BEGIN</span>
- <span style="color: #008080">4</span> <span style="color: #808080">-></span> <span style="color: #0000ff">SET</span> <span style="color: #008000">@x</span> <span style="color: #808080">=</span> <span style="color: #800000; font-weight: bold">0</span><span style="color: #000000">;
- </span><span style="color: #008080">5</span> <span style="color: #808080">-></span> REPEAT <span style="color: #0000ff">SET</span> <span style="color: #008000">@x</span> <span style="color: #808080">=</span> <span style="color: #008000">@x</span> <span style="color: #808080">+</span> <span style="color: #800000; font-weight: bold">1</span>; UNTIL <span style="color: #008000">@x</span> <span style="color: #808080">></span> p1 <span style="color: #0000ff">END</span><span style="color: #000000"> REPEAT;
- </span><span style="color: #008080">6</span> <span style="color: #808080">-></span> <span style="color: #0000ff">END</span>
- <span style="color: #008080">7</span> <span style="color: #808080">-></span> <span style="color: #808080">//</span>
- <span style="color: #008080">8</span> Query OK, <span style="color: #800000; font-weight: bold">0</span> rows affected (<span style="color: #800000; font-weight: bold">0.00</span><span style="color: #000000"> sec)
- </span><span style="color: #008080">9</span> mysql<span style="color: #808080">></span> delimiter ;
触发器真是个好东西,自动化的神器啊…… 改天好好再研究研究、发掘发掘~~~
MySQL触发器初试:当A表插入新记录,自动在B表中插入相同ID的记录
标签:logs 自动 相同 开始 示例 insert into sql语句 不能