Heim > Datenbank > MySQL-Tutorial > Hauptteil

学习笔记之MySQL触发器详解

WBOY
Freigeben: 2016-06-07 17:52:43
Original
1104 Leute haben es durchsucht

触发器是由事件来触发某个操作,这些事件包括INSERT语句,UPDATE语句和DELETE语句

创建触发器

创建只有一个执行语句的触发器
CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
ON 表名 FOR EACH ROW 执行语句其中,触发器名参数指要创建的触发器的名字

1、创建MySQL触发器:

语法:

 代码如下 复制代码

CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name 

FOR EACH ROW 

BEGIN 

trigger_stmt 

END; 

CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name

FOR EACH ROW 

BEGIN

trigger_stmt

END;

 


例子

 代码如下 复制代码

CREATE TRIGGER SetUserHome after insert ON users 

FOR EACH ROW 

BEGIN 

update `users` set homeLocationX = 128,

homeLocationY=128, homeLocationZ=30 

where uuid = NEW.uuid

END 

以上的例子是错误的, 让本表进行触发时进行更新会让程序进入死循环。


系统会报这样的错误:it is already used by statement which invoked this stored function/trigger.

应该改成以下语句:

 代码如下 复制代码

CREATE TRIGGER SetUserHome before insert ON users 

FOR EACH ROW 

BEGIN 

set New.homeLocationX = 128;

set New.homeLocationY = 128;

set New.homeLocationZ=30; 

END 

BEFORE和AFTER参数指定了触发执行的时间,在事件之前或是之后

FOR EACH ROW表示任何一条记录上的操作满足触发事件都会触发该触发器

 代码如下 复制代码

mysql> CREATE TRIGGER trig1 AFTER INSERT
    -> ON work FOR EACH ROW
    -> INSERT INTO time VALUES(NOW());


Query OK, 0 rows affected (0.09 sec)上面创建了一个名为trig1的触发器,一旦在work中有插入动作,就会自动往time表里插入当前时间

 

创建有多个执行语句的触发器

CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
ON 表名 FOR EACH ROW
BEGIN
    执行语句列表
END其中,BEGIN与END之间的执行语句列表参数表示需要执行的多个语句,不同语句用分号隔开

tips:一般情况下,mysql默认是以 ; 作为结束执行语句,与触发器中需要的分行起冲突

     为解决此问题可用DELIMITER,如:DELIMITER ||,可以将结束符号变成||

     当触发器创建完成后,可以用DELIMITER ;来将结束符号变成;

 

 代码如下 复制代码

mysql> DELIMITER ||
mysql> CREATE TRIGGER trig2 BEFORE DELETE
    -> ON work FOR EACH ROW
    -> BEGIN
    -> INSERT INTO time VALUES(NOW());
    -> INSERT INTO time VALUES(NOW());
    -> END
    -> ||
Query OK, 0 rows affected (0.06 sec)


 

mysql> DELIMITER ;上面的语句中,开头将结束符号定义为||,中间定义一个触发器,一旦有满足条件的删除操作

就会执行BEGIN和END中的语句,接着使用||结束

最后使用DELIMITER ; 将结束符号还原

 查看触发器

SHOW TRIGGERS语句查看触发器信息

 代码如下 复制代码
mysql> SHOW TRIGGERSG;
*************************** 1. row ***************************
             Trigger: trig1
               Event: INSERT
               Table: work
           Statement: INSERT INTO time VALUES(NOW())
              Timing: AFTER
             Created: NULL
            sql_mode:
             Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ci

  Database Collation: latin1_swedish_ci结果会显示所有触发器的基本信息

tips:SHOW TRIGGERS语句无法查询指定的触发器

 在triggers表中查看触发器信息

 代码如下 复制代码
mysql> SELECT * FROM information_schema.triggersG
*************************** 1. row ***************************
           TRIGGER_CATALOG: def
            TRIGGER_SCHEMA: person
              TRIGGER_NAME: trig1
        EVENT_MANIPULATION: INSERT
      EVENT_OBJECT_CATALOG: def
       EVENT_OBJECT_SCHEMA: person
        EVENT_OBJECT_TABLE: work
              ACTION_ORDER: 0
          ACTION_CONDITION: NULL
          ACTION_STATEMENT: INSERT INTO time VALUES(NOW())

结果显示了所有触发器的详细信息,同时,该方法可以查询制定触发器的详细信息

 

 代码如下 复制代码
mysql> SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME='trig1'G
*************************** 1. row ***************************
           TRIGGER_CATALOG: def
            TRIGGER_SCHEMA: person
              TRIGGER_NAME: trig1
        EVENT_MANIPULATION: INSERT
      EVENT_OBJECT_CATALOG: def
       EVENT_OBJECT_SCHEMA: person
        EVENT_OBJECT_TABLE: worktips

:所有触发器信息都存储在information_schema数据库下的triggers表中

     可以使用SELECT语句查询,如果触发器信息过多,最好通过TRIGGER_NAME字段指定查询

 删除触发器

mysql> DROP TRIGGER trig1;
Query OK, 0 rows affected (0.04 sec)删除触发器之后最好使用上面的方法查看一遍

同时,也可以使用database.trig来指定某个数据库中的触发器

tips:如果不需要某个触发器时一定要将这个触发器删除,以免造成意外操

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage