mysql 触发器详解 代码 错语解答

触发器trigger 

作用:可以监视 增删改操作 并触发 增删改操作

监视对象:TALBE表    监视事件:insert update delete 触发时间:
after before  触发事件 insert update delete

万能模版:

创建触发器 

create  trigger 触发器名称 

after/before  insert/update/delete on 表名 

for each row 

begin  

sql 语句—一个或者多个语句范围在 insert/update/delete内; 

end 

如果只有一条SQL语句,可以不用begin  end 。直接后面接上就行。

FOR EACH ROW  --触发器的执行间隔:FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。

还有就是在触发器中使用变量

[sql] view
plain
copyprint?

  1. set @t_id=new.id;  
  2.   
  3. set @t_id=old.id;
     

new可以或则到你新添加进来的数据 old其实也可以 但是在old只可以在update中使用

Before与After区别:before:(insert、update)可以对new进行修改,after不能对new进行修改。两者都不能修改old数据。

 在本表插入字段值需要用new计算,只能用before,在别的表中记录插入成功记录或统计插入的条数用after。

变量的话,无论Before,After都可以用。

定义变理有两种方式:

一:declare t_id int(10);//先申明
       set t_id= new.ID;

二:set @t_name= 'P_Business';;//不事先申明,直接创建

第一种方式不推荐。实验证明,变量值只能被附于更大的值,而不能被附于更小的值,有时候还会有幻值。我也不知道这是怎么回事。但用@定义的值就没有这样的问题。

变理可以附于常量,也可以直接附给结果:

SET @ver = (SELECT VERSION FROM zf_cnc_conference.userinfo WHERE  username=new.MobileNum);

还可以更复杂一些:

  1. SET @new_version=(SELECT IFNULL(@ver,0)) ;  
  2. INSERT INTO zf_cnc_conference.userinfo  
  3.         (organizerID,   
  4.         username,   
  5.         email,   
  6.         mobile,   
  7.         telephone,  
  8.         createDate,  
  9.         sipName,  
  10.         sipNum,  
  11.         sipPwd,  
  12.         VERSION  
  13.         )  
  14.         VALUES  
  15.         ( new.organizerID,   
  16.          new.MobileNum,   
  17.         '',   
  18.          new.MobileNum,   
  19.          new.MobileNum,  
  20.          new.CreateTime,  
  21.          new.sipName,  
  22.          new.sipNum,  
  23.          new.sipPwd,  
  24.          @new_version  
  25.         );  

变量中NEW的用法,NEW只能搭配before用,作用是从提交上来的SQL语句中调取字段中的内容。比如:set @t_id= new.ID;SQL语句中的ID值会被提取出来,赋值给变量t_id。

需要注意以下几点:

1.MySQL触发器针对行来操作,因此当处理大数据集的时候可能效率很低。

2.触发器不能保证原子性,例如在MYISAM中,当一个更新触发器在更新一个表后,触发对另外一个表的更新,若触发器失败,不会回滚第一个表的更新。InnoDB中的

 触发器和操作则是在一个事务中完成,是原子操作。

时间: 2024-10-31 20:06:29

mysql 触发器详解 代码 错语解答的相关文章

学习笔记之MySQL触发器详解

创建触发器 创建只有一个执行语句的触发器 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 TR

MySQL MEM_ROOT详解及实例代码_Mysql

MySQL MEM_ROOT详解 这篇文章会详细解说MySQL中使用非常广泛的MEM_ROOT的结构体,同时省去debug部分的信息,仅分析正常情况下,mysql中使用MEM_ROOT来做内存分配的部分. 在具体分析之前我们先例举在该结构体使用过程中用到的一些宏: #define MALLOC_OVERHEAD 8 //分配过程中,需要保留一部分额外的空间 #define ALLOC_MAX_BLOCK_TO_DROP 4096 //后续会继续分析该宏的用途 #define ALLOC_MAX_

mysql count详解及函数实例代码

mysql count详解 count函数是用来统计表中或数组中记录的一个函数,下面我来介绍在mysql中count函数用法. count(*) 它返回检索行的数目, 不论其是否包含 NULL值. SELECT 从一个表中检索,而不检索其它的列,并且没有 WHERE子句时, COUNT(*)被优化到最快的返回速度. 例如: mysql> SELECT COUNT(*) FROM student; COUNT(DISTINCT 字段)这个优化仅适用于 MyISAM表, 原因是这些表类型会储存一个函

MySQL存储过程详解 mysql 存储过程

mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的

Java实现调用MySQL存储过程详解_java

前言 存储过程(Stored Procedure)是存储在数据库中经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它. Java调用MySQL的存储过程,需要用JDBC连接,环境eclipse 首先查看MySQL中的数据库的存储过程,接着编写代码调用 mysql> show procedure status; +------+-------------+-----------+----------------+-------------

JDBC 连接MySQL实例详解_Mysql

JDBC连接MySQL JDBC连接MySQL 加载及注册JDBC驱动程序 Class.forName("com.mysql.jdbc.Driver"); Class.forName("com.mysql.jdbc.Driver").newInstance(); JDBC URL 定义驱动程序与数据源之间的连接 标准语法: <protocol(主要通讯协议)>:<subprotocol(次要通讯协议,即驱动程序名称)>:<data so

mysql 存储过程详解_Mysql

MySQL存储过程  14.1.1 创建存储过程 MySQL中,创建存储过程的基本形式如下: CREATE PROCEDURE sp_name ([proc_parameter[,...]])          [characteristic ...] routine_body 其中,sp_name参数是存储过程的名称:proc_parameter表示存储过程的参数列表: characteristic参数指定存储过程的特性:routine_body参数是SQL代码的内容,可以用BEGIN-END

MySQL Join详解

mysql|详解 还是先 Create table 吧  create table emp(  id int not null primary key,  name varchar(10)  );   create table emp_dept(  dept_id varchar(4) not null,  emp_id int not null,  emp_name varchar(10),  primary key (dept_id,emp_id));   insert into emp()

SqlServer触发器详解

触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行. 触发器经常用于加强数据的完整性约束和业务规则等. 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到.SQL3的触发器是一个能由系统自动执行对数据库修改的语句. 触发器可以查询其他表,