精华内容
下载资源
问答
  • 2016-06-15 12:59:28

    查看触发器

    1 SHOW TRIGGERS 语句查看触发器信息

    eg:

    SHOW TRIGGERS;
    2 在 triggers 表中查看触发器信息

    删除触发器

    DROP TRIGGER 触发器名;

    eg:

    DROP TRIGGER trig_book ;

    DROP TRIGGER trig_book2 ;

    更多相关内容
  • mysql删除触发器

    2021-07-16 17:27:36
    +-----------+ | row_count | +-----------+ | 5 | +-----------+ 1 row in set (0.00 sec) mysql> mysql> -- record loop count of trigger in a table mysql> drop table if exists rows_affected; create table ...

    I think I read that the delete trigger doesn't know what data was deleted and loops over the whole table applying the trigger. Is that true?

    Does that mean that the before delete loops over the whole table before the data is deleted and after delete loops over the whole table after the delete occurs?

    Is there no way to loop over just the deleted records? So If 10 records are deleted loop over them?

    DELIMITER $$

    DROP TRIGGER `before_delete_jecki_triggername`$$

    CREATE TRIGGER before_delete_triggername

    BEFORE DELETE ON table

    FOR EACH ROW

    BEGIN

    /*do stuff*/

    END$$

    DELIMITER ;

    Thanks,

    Mat

    解决方案

    I think it was due to a confusion with FOR EACH ROW statement.

    It is only for "matched records for the statement issued before trigger is invoked."

    If there exists N number of records in a table and matches records for where id=x,

    assuming x causes a result of less than N records, say N-5, then

    FOR EACH ROW causes a loop for N-5 times only.

    UPDATE:

    A sample test run on the rows affected due to FOR EACH ROW statement is shown below.

    mysql> -- create a test table

    mysql> drop table if exists tbl; create table tbl ( i int, v varchar(10) );

    Query OK, 0 rows affected (0.01 sec)

    Query OK, 0 rows affected (0.06 sec)

    mysql> -- set test data

    mysql> insert into tbl values(1,'one'),(2,'two' ),(3,'three'),(10,'ten'),(11,'eleven');

    Query OK, 5 rows affected (0.02 sec)

    Records: 5 Duplicates: 0 Warnings: 0

    mysql> select * from tbl;

    +------+--------+

    | i | v |

    +------+--------+

    | 1 | one |

    | 2 | two |

    | 3 | three |

    | 10 | ten |

    | 11 | eleven |

    +------+--------+

    5 rows in set (0.02 sec)

    mysql> select count(*) row_count from tbl;

    +-----------+

    | row_count |

    +-----------+

    | 5 |

    +-----------+

    1 row in set (0.00 sec)

    mysql>

    mysql> -- record loop count of trigger in a table

    mysql> drop table if exists rows_affected; create table rows_affected( i int );

    Query OK, 0 rows affected (0.02 sec)

    Query OK, 0 rows affected (0.05 sec)

    mysql> select count(*) 'rows_affected' from rows_affected;

    +---------------+

    | rows_affected |

    +---------------+

    | 0 |

    +---------------+

    1 row in set (0.00 sec)

    mysql>

    mysql> set @cnt=0;

    Query OK, 0 rows affected (0.00 sec)

    mysql>

    mysql> -- drop trigger if exists trig_bef_del_on_tbl;

    mysql> delimiter //

    mysql> create trigger trig_bef_del_on_tbl before delete on tbl

    -> for each row begin

    -> set @cnt = if(@cnt is null, 1, (@cnt+1));

    ->

    -> /* for cross checking save loop count */

    -> insert into rows_affected values ( @cnt );

    -> end;

    -> //

    Query OK, 0 rows affected (0.00 sec)

    mysql>

    mysql> delimiter ;

    mysql>

    mysql> -- now let us test the delete operation

    mysql> delete from tbl where i like '%1%';

    Query OK, 3 rows affected (0.02 sec)

    mysql>

    mysql> -- now let us see what the loop count was

    mysql> select @cnt as 'cnt';

    +------+

    | cnt |

    +------+

    | 3 |

    +------+

    1 row in set (0.00 sec)

    mysql>

    mysql> -- now let us see the table data

    mysql> select * from tbl;

    +------+-------+

    | i | v |

    +------+-------+

    | 2 | two |

    | 3 | three |

    +------+-------+

    2 rows in set (0.00 sec)

    mysql> select count(*) row_count from tbl;

    +-----------+

    | row_count |

    +-----------+

    | 2 |

    +-----------+

    1 row in set (0.00 sec)

    mysql> select count(*) 'rows_affected' from rows_affected;

    +---------------+

    | rows_affected |

    +---------------+

    | 3 |

    +---------------+

    1 row in set (0.00 sec)

    mysql>

    展开全文
  • MySQL触发器语法详解:  触发器 trigger是一种特殊的存储过程,他在插入(inset)、删除(delete)或修改(update)特定表中的数据时触发执行,它比数据本身标准的功能更精细和更复杂的数据控制能力。触发器不是由...
  • 文章目录1 触发器的概念2 触发器的创建2.1 语法2.2 举例3 查看、删除触发器3.1 查看3.2 删除触发器4 优缺点4.1 优点4.2 缺点5 注意点 1 触发器的概念 触发器是由事件来触发某个操作,这些事件包括INSERT、UPDATE、...

    1 触发器的概念

    • 触发器是由事件来触发某个操作,这些事件包括INSERT、UPDATE、DELETE事件。
    • 所谓事件就是指用户的动作或者触发某项行为。如果定义了触发程序,当数据库执行这些语句时候,就相当于事件发生了,就会自动激发触发器执行相应的操作。
    • 当对数据表中的数据执行插入、更新和删除操作,需要自动执行一些数据库逻辑时,可以使用触发器来实现。

    2 触发器的创建

    2.1 语法

    CREATE TRIGGER 触发器名称
    {BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名
    FOR EACH ROW
    触发器执行的语句块;
    

    2.2 举例

    CREATE DATABASE trigger_test;
    USE trigger_test;
    
    CREATE TABLE test_trigger ( 
    	id INT PRIMARY KEY AUTO_INCREMENT,
    	t_note VARCHAR ( 30 ) 
     );
    
    CREATE TABLE test_trigger_log ( 
    	id INT PRIMARY KEY AUTO_INCREMENT,
    	t_log VARCHAR ( 30 ) 
     );
    
    #举例1	
    #创建触发器
    #创建名称为before_insert_test_tri的触发器,向test_trigger数据表插入数据之前,向test_trigger_log数据表中插入before_insert的日志信息。
    CREATE TRIGGER before_insert_test_tri BEFORE INSERT ON test_trigger FOR EACH ROW
    BEGIN
    		INSERT INTO test_trigger_log ( t_log )
    	VALUES
    	( 'before insert...' );
    END;
    
    #测试
    INSERT INTO test_trigger ( t_note )
    VALUES
    	( 'test' );
    	
    	#查询
    SELECT
    	* 
    FROM
    	test_trigger;
    SELECT
    	* 
    FROM
    	test_trigger_log;
    	
    
    #举例2
    #创建名称为after_insert_test_tri的触发器,向test_trigger数据表插入数据之后,向test_triggerIog数据表中插入after insert的日志信息。
    CREATE TRIGGER after_insert_test_tri AFTER INSERT ON test_trigger FOR EACH ROW
    BEGIN
    		INSERT INTO test_trigger_log ( t_log )
    	VALUES
    	( 'after insert' );
    END;
    
    #测试
    INSERT INTO test_trigger ( t_note )
    VALUES
    	( 'test2' );
    	
    	#查询
    SELECT
    	* 
    FROM
    	test_trigger;
    SELECT
    	* 
    FROM
    	test_trigger_log;
    	
    	
    #举例3:
    #定义触发器“salarycheck_trigger",基于员工表“employees"的INSERT事件,在INSERT之前检查将要添加的新员工薪资是否大于他领导的薪资,如果大于领导薪资,则报sqlstate_value为'HY000'的错误,从而使得添加失败。
    CREATE TRIGGER salary_check_trigger BEFORE
    	INSERT ON employees FOR EACH ROW
    	BEGIN
    		DECLARE
    			manager_sal DOUBLE;#领导工资
    #查询到要添加的数据的manager的薪资
    		SELECT
    			salary INTO manager_sal 
    		FROM
    			employees 
    		WHERE
    			employee_id = NEW.manager_id ;#new代表当前插入的数据
    		IF
    			NEW.salary > manager_sal THEN
    				SIGNAL SQLSTATE 'HY000' 
    				SET MESSAGE_TEXT = '薪资高于领导错误';
    		END IF;
    END;
    #测试   1644 - 薪资高于领导错误
    INSERT INTO employees( employee_id, last_name, email, hire_date, job_id, salary, manager_id )
    VALUES
    	( 300, 'Tom', 'tom@126.com', CURDATE(), 'AD_VP', 150000, 103 );
    

    3 查看、删除触发器

    3.1 查看

    #方式一:查看所有触发器
    SHOW TRIGGERS;
    #方式二:查看指定触发器
    SHOW CREATE TRIGGER salary_check_trigger;
    #方式三:从系统库中查看
    SELECT * FROM information_schema.`TRIGGERS`;
    

    3.2 删除触发器

    #删除
    DROP TRIGGER before_insert_test_tri;
    

    4 new与old

    • 当使用insert语句的时候,要插入的数据就是new。
    • 当使用delete语句的时候,要删除的那一条数据就是old。
    • 当使用update语句的时候,被修改的旧数据就是old,要修改为的新数据就是new。

    5 优缺点

    5.1 优点

    • 触发器可以确保数据的完整性。
    • 触发器可以帮助我们记录操作日志。
    • 触发器还可以用在操作数据前,对数据进行合法性检查。

    5.2 缺点

    • 触发器最大的一个问题就是可读性差(A表插入数据时报B表插入数据错误)。
    • 相关数据的变更,可能会导致触发器出错。

    6 注意点

    注意,如果在子表中定义了外键约束,并且外键指定了ON UPDATE/DELETE CASCADE/SET NULL子句,此时修改父表被引用的键值或删除父表被引用的记录行时,也会引起子表的修改和删除操作,此时基于子表的UPDATE和DELETE语句定义的触发器并不会被激活。

    展开全文
  • 主要介绍了MySQL触发器基本用法,结合实例形式分析了mysql触发器的基本创建、查看、删除等相关使用方法与注意事项,需要的朋友可以参考下
  • 本文实例讲述了mysql触发器之创建多个触发器操作。分享给大家供大家参考,具体如下: 这次记录的内容mysql 版本必须得是5.7.2+的哈,之前的会不好使的。废话不多说,咱们开始正文哈。 在mysql 5.7.2+版本之前,我们...
  • MySQL触发器

    千次阅读 2022-03-04 15:27:55
    1. MySQL触发器的概念与作用 触发器概念:触发器是一种特殊的存储过程,它在试图更改触发器所保护的数据时自动执行。 触发器与存储过程的异同 相同点:1. 触发器是一种特殊的存储过程,触发器和存储过程一样是一个...

    1. MySQL触发器的概念与作用

    触发器概念:触发器是一种特殊的存储过程,它在试图更改触发器所保护的数据时自动执行。

    触发器与存储过程的异同
    相同点:1. 触发器是一种特殊的存储过程,触发器和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的SQL片段。
    不同点:2. 存储器调用时需要调用SQL片段,而触发器不需要调用,当对数据库表中的数据执行DML操作时自动触发这个SQL片段的执行,无需手动调用。

    • 在MySQL中,只有执行insert,delete,update操作时才能触发触发器的执行;
    • 触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作;
    • 使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发;

    触发器的特性
    在这里插入图片描述
    触发器的作用

    1. 安全性。能够基于数据库的值使用户具有操作数据库的某种权利。
    • 能够基于时间限制用户的操作,比如不同意下班后和节假日改动数据库数据。

    • 能够基于数据库中的数据限制用户的操作,比如不同意股票的价格的升幅一次超过10%。

    1. 审计。能够跟踪用户对数据库的操作。
    • 审计用户操作数据库的语句。

    • 把用户对数据库的更新写入审计表。

    1. 实现复杂的数据完整性规则
    • 实现非标准的数据完整性检查和约束。触发器可产生比规则更为复杂的限制。与规则不同,触发器能够引用列或数据库对象。比如,触发器可回退不论什么企图吃进超过自己保证金的期货。
    • 提供可变的缺省值。
    1. 实现复杂的非标准的数据库相关完整性规则。触发器能够对数据库中相关的表进行连环更新。比如,在auths表author_code列上的删除触发器可导致对应删除在其他表中的与之匹配的行。
    • 在改动或删除时级联改动或删除其他表中的与之匹配的行。

    • 在改动或删除时把其他表中的与之匹配的行设成NULL值。

    • 在改动或删除时把其他表中的与之匹配的行级联设成缺省值。

    • 触发器可以拒绝或回退那些破坏相关完整性的变化,取消试图进行数据更新的事务。当插入一个与其主健不匹配的外部键时,这样的触发器会起作用。比如,可以在books.author_code 列上生成一个插入触发器,假设新值与auths.author_code列中的某值不匹配时,插入被回退。

    1. 同步实时地复制表中的数据。
    2. 自己主动计算数据值,假设数据的值达到了一定的要求,则进行特定的处理。比如,假设公司的帐号上的资金低于5万元则马上给財务人员发送警告数据。

    1.1 创建触发器

    在这里插入图片描述

    create database if not exists mydb01_trigger;
    
    use mydb01_trigger;
    
    -- 用户表
    
    create table if not exists user(
     uid int primary key auto_increment,
     username varchar(50) not null,
     password varchar(50) not null
    )default charset=utf8;
    
    -- 用户信息操作日志表
    create table if not exists user_logs(
     id int primary key auto_increment,
     time timestamp,
     log_text varchar(100)
     )default charset=utf8;
     
    -- 需求1:当user表添加一行数据,则会自动在user_log添加日志记录
    -- 定义触发器: trigger_test1
    create trigger trigger_test1 after insert on user for each row
    insert into user_logs values(NULL,now(),'new');
    
    -- 在user表添加数据,让触发器自动执行
    insert into user values(2,'zbb','123456');
    

    1.2 触发器类型NEW和OLD的使用

    在这里插入图片描述
    在这里插入图片描述

    
    create database if not exists mydb01_trigger;
    
    use mydb01_trigger;
    
    -- 用户表
    
    create table if not exists user(
     uid int primary key auto_increment,
     username varchar(50) not null,
     password varchar(50) not null
    )default charset=utf8;
    
    -- 用户信息操作日志表
    
    create table if not exists user_logs(
     id int primary key auto_increment,
     time timestamp,
     log_text varchar(255)
     )default charset=utf8;
     
    -- 需求1:当user表添加一行数据,则会自动在user_log添加日志记录
    -- 定义触发器: trigger_test1
    create trigger trigger_test1 after insert on user for each row
    insert into user_logs values(NULL,now(),'new');
    
    -- 在user表添加数据,让触发器自动执行
    insert into user values(3,'zbb','123456');
     
     
     -- NEW和OLD
     -- insert 触发器
     -- NEW
     -- 定义触发器: trigger_test2
    drop trigger trigger_test1
    create trigger trigger_test2 after insert on user for each row
    insert into user_logs values(NULL,now(),concat('有新用户添加,信息为:',NEW.username,NEW.password));
    
    insert into user values(4,'abb','123456');
    
     -- update 触发器
     -- NEW
     -- 定义触发器: trigger_test3
     -- OLD
    drop trigger trigger_test2
    create trigger trigger_test3 after update on user for each row
    insert into user_logs values(NULL,now(),concat('有用户信息修改,旧数据是:',OLD.uid,OLD.username,OLD.password));
    
    update user set password = '00000' where uid=3;
    
     -- NEW
     drop trigger trigger_test3
    create trigger trigger_test4 after update on user for each row
    insert into user_logs values(NULL,now(),concat('有用户信息修改:新数据是',NEW.uid,NEW.username,NEW.password));
    
    update user set password = '666666' where uid=3;
    
    -- delete类型触发器
    -- OLD
    create trigger trigger_test5 after delete on user for each row
    insert into user_logs values(NULL,now(),concat('有用户被删除,删除信息为:',OLD.uid,OLD.username,OLD.password));
    
    delete from user where uid=3;
    
    

    参考

    https://www.cnblogs.com/mengfanrong/p/3851410.html
    https://www.bilibili.com/video/BV1iF411z7Pu?p=126&spm_id_from=pageDriver

    展开全文
  • MySQL触发器

    2021-01-25 16:35:11
    触发器介绍用途:当我们希望用户在使用数据库时(增删改查),数据库会自动执行一些命令,而不是人为的去敲命令,或者是开发人员在代码里写命令。场景:我们希望用户在对表进行修改时,可以把修改同步到另一张表实现:...
  • mysql创建触发器

    2022-04-18 15:56:49
    一、 触发器的介绍 1.1 触发器的分类 触发器分为 for each row(作用在每行)和 for each statement(作用在每条语句),这二者的区别的就是当一条语句使得多条记录发生改变时,前者会触发多次触发器,而后者只会触发一...
  • 再写程序去弄的话,流程上比较麻烦,而且也没必要,故采用触发器的方式去实现,等用户部署稳定版后再把触发器删除即可。  具体sql参考下图,主要逻辑为根据t_account表的增删改去更新A表和B表的记录。(为啥是图片,...
  • MySQL编写触发器

    2021-03-15 01:02:35
    触发器语法示例:CREATE TRIGGER trigger_name trigger_time trigger_event ON tb_name FOR EACH ROW trigger_stmt trigger_name:触发器的名称 tirgger_time:触发时机,为BEFORE或者AFTER trigger_event:触发事件...
  • MySQL触发器

    千次阅读 2021-05-14 18:33:38
    在数据表中发生了某件事(插入、删除、更新操作),然后自动触发了预先编好的若干条SQL语句的执行。 二、触发器的特点及作用 特点: 触发事件的操作和触发器里面的SQL语句是一个事物操作,具有原子性,要么全部执行...
  • 创建MySQL触发器

    2022-04-07 18:27:36
    MySQL中,创建触发器语法如下: CREATE TRIGGER trigger_nametrigger_time trigger_event ON tbl_name FOR EACH ROWtrigger_stmt 其中: trigger_name:标识触发器名称,用户自行指定; trigger_time:标识触发...
  • 本文将介绍mysql 触发器实现两个表的数据同步,需要的朋友可以参考
  • MySQL触发器

    2021-01-19 12:55:14
    一、基本概念触发器是一种特殊类型的存储过程,它不同于存储过程,主要是通过事件触发而被执行的,即不是主动调用而执行的;而存储过程则需要主动调用其名字执行触发器:trigger,是指事先为某张表绑定一段代码,当...
  • 基本语法 ...触发器的名称,触发器在当前数据库中必须具有唯一的名称。如果要在某个特定数据库中创建,名称前面应该加上数据库的名称。 2) INSERT | UPDATE | DELETE 触发事件,用于指定激活触发器
  • 主要介绍了mysql 触发器语法与应用,结合实例形式详细分析了mysql 触发器的基本语法与插入、更细、删除等相关操作技巧,需要的朋友可以参考下
  • MySQL数据库触发器

    2021-11-08 22:23:23
    MySQL 数据库中触发器是一个特殊的存储过程,不同的是执行存储过程要使用 CALL 语句来调用,而触发器的 执行不需要使用 CALL 语句来调用,也不需要手工启动,只要一个预定义的事件发生就会被 MySQL自动调用 ...
  • 1、使用以下sql语句生成删除所有触发器的语句 SELECT CONCAT('DROP TRIGGER ', TRIGGER_NAME, ';') FROM information_schema.`TRIGGERS` WHERE TRIGGER_SCHEMA = 'collector' 2、将执行结果复制出来,粘贴到 ...
  • 举例如下:现有表tab1和tab2要求触发器具有下面功能当对tab1插入一条记录时则tab2也插入相同的记录mysql>delimiter //mysql> CREATE TRIGGER t_afterinsert_on_tab1-> AFTER INSERT ON tab1-> FOR EACH ...
  • MySQL 修改和删除触发器

    千次阅读 2020-03-14 09:49:31
    与其他 MySQL 数据库对象一样,可以使用 DROP 语句将触发器从数据库中删除。 语法格式如下: DROP TRIGGER [ IF EXISTS ] [数据库名] <触发器名> 语法说明如下: 1 触发器名 要删除触发器名称。 2 数据库名...
  • mysql添加触发器

    2020-01-10 10:49:49
    @mySql添加触发器 关于mysql管理Navicta,如何添加触发器 比如:需要在student中添加一个触发器,使得在删除了student信息表时,grade表中对应的成绩数据删除。 在表->设计表->触发器 ...
  • -> // +----+---------+--------+ | id | main_id | value | +----+---------+--------+ | 2 | 2 | TWOTWO | +----+---------+--------+ 1 row in set (0.00 sec) 如果你非要使用触发器来处理, ...
  • 触发器的概念 当我们对一个表进行数据操作时,需要同步对其它的表执行相应的操作...MySQL从5.0.2版本开始支持触发器。 创建触发器MySQL中创建触发器通过SQL语句CREATE TRIGGER来实现,其语法形式如下: CR...
  • 内包含外键约束模式,数据库的视图基本操作
  • mysql日志触发器

    2022-05-28 19:14:30
    目录 1.创建数据库create database test character set utf...7.创建删除触发器 8.查看创建的触发器 9.测试插入触发器 10.删除触发器 1.创建数据库 create database test character set utf8 collate utf8_b..
  • 基本语法 与其他MySQL 数据库对象一样,可以使用 DROP 语句将触发器从数据库中删除。语法格式如下:DROP TRIGGER [ IF EXISTS ] [数据库名] 语法说明如下:1) 触发器名 要删除触发器名称。2) 数据库名 可选项。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,651
精华内容 20,260
关键字:

mysql删除触发器

mysql 订阅
友情链接: Arca2Core.rar