创建 Mysql 跨库触发器

因项目需要,对于数据库操作是需要在mysql中创建一个跨库的触发器,此为前提,但在在使用过程中,老是出错,在google上搜索了一个多小时才将问题解决。真是汗啊。

先了解下什么是触发器:

  • 触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。
  • 触发器有一个非常好的特性就是:触发器可以禁止或回滚违反引用完整性的更改,从而取消所尝试的数据修改。

需求描述:

  • 同一服务器中有两个数据库database1、database2,database1 中有表table1(id,name),datebase2中有表table2(id,name,sex,age)。当数据库database2中表table2中插入一条新记录时,需要在database1库table1表中插入一条新记录new,并且这条新纪录的name = new.name。
  • 错误示范:环境mysql版本为5.7.11,数据库database2中的 sql 语句如下:
1
2
3
4
5
6
7
DROP TRIGGER IF EXISTS table2_insert_trigger;
CREATE TRIGGER table2_insert_trigger
AFTER INSERT ON table2
FOR EACH ROW
BEGIN
INSERT INTO database1.table1(name) VALUES(new.name);
END

此代码总是报错,第五行处有语法错误,真是奇怪哈,当时我使出浑身解数,双眼盯着这几行sql看了个海枯石烂,天荒地老,即使盘古开天辟地女娲重新造人都没有看出结果来。心累。。。

mysql中的delimiter

delimiter 命令就是定义分隔符的意思,默认情况下,delimiter是分号;。在命令行客户端中,如果有一行命令以分号结束,那么回车后,MySQL将会执行该命令。如输入下面的语句

1
MySQL> select * from test_table;

然后回车,那么MySQL将立即执行该语句。但有的时候我们不希望立即执行就比如上面的例子,当遇到 INSERT INTO database1.table1(name) VALUES(new.name);中的‘;’时,mysql语句立即执行,所以导致mysql语句在这一行有语法错误。默认情况下,delimiter “;” 用于向 MySQL 提交查询语句。在存储过程中每个 SQL 语句的结尾都有个 “;”,如果这时候,每逢 “;” 就向 MySQL 提交的话,当然会出问题了。

delimiter使用

正确的mysql夸库触发器(trigger)使用代码如下:

1
2
3
4
5
6
7
8
9
10
delimiter $$ # 申明结束符为’$$‘,注意有空格
DROP TRIGGER IF EXISTS table2_insert_trigger;
CREATE TRIGGER table2_insert_trigger
AFTER INSERT ON table2
FOR EACH ROW
BEGIN
INSERT INTO database1.table1(name) VALUES(new.name);
END;
$$
delimiter ; # 最后将结束符设为';'

mysql 中常用的delimiter结束符设置有:’//‘、’$$‘,当然完全可以自己定义。

触发器的查询和删除

1
2
SELECT * FROM information_schema.`TRIGGERS`; #查询
DROP TRIGGER IF EXISTS 'triggerName'
文章目录
  1. 1. 先了解下什么是触发器:
  2. 2. 需求描述:
  3. 3. mysql中的delimiter
  4. 4. delimiter使用
  5. 5. 触发器的查询和删除
,