一、触发器

触发器(TRIGGER):是由事件来触发某个操作。当数据库系统执行这些事件时,就会激活触发器执行相应的操作。MySQL从5.0.2版本开始支持触发器。
触发事件:INSERT语句、UPDATE语句和DELETE语句。

1、创建触发器

1.1、创建只有一个执行语句的触发器

CREATE  TRIGGER 触发器名  BEFORE | AFTER  触发事件
ON  表名 FOR  EACH  ROW  执行语句
 

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

DELIMITER&&
CREATE  TRIGGER 触发器名  BEFORE | AFTER  触发事件
ON  表名 FOR  EACH  ROW
BEGIN
执行语句列表
END
&&
DELEMITER ;
 
注:DELIMITER,重定义结束符,分隔符。一般SQL “;”结束,在创建多个语句执行的触发器时,要用到“;”,所以用DELIMETER来切换一下。

1.3例:

CREATE TRIGGER dept_tig1 BEFORE INSERT ON department
FOR EACH ROW
INSERT INTO trigger_time VALUES(NOWS());

1.4触发器的使用

 MySQL中,触发器执行的顺序是BEFORE触发器、表操作(INSERT、UPDATE 和DELETE)、AFTER触发器触发器中不能包含START TRANSACTION(事务,并发控制单位), COMMIT,ROLLBACK,CALL等。

2、查看触发器

SHOW  TRIGGERS ;

SELECT  *  FROM  information_schema. triggers ;
SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME='触发器名';

注:information_schema.triggers:表示information_schema数据库下面的triggers表。

3、删除触发器

DROP TRIGGER  触发器名 ;

教程链接:http://blog.csdn.net/kimsoft/article/details/6757457


二、存储过程和函数

存储过程(Stored Procedure),是一组为了完成特定功能的SQL 语句,集经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数,如果该存储过程带有参数来执行。

1、MySQL存储过程的创建

1.1格式

CREATE PROCEDURE 过程名 ([过程参数[,...]])
[特性 ...] 过程体

1.2例:

  1. mysql> DELIMITER //
  2. mysql> CREATE PROCEDURE proc1(OUT s int)
  3. -> BEGIN
  4. -> SELECT COUNT(*) INTO s FROM user;
  5. -> END
  6. -> //
  7. mysql> DELIMITER ;

注:
(1)这里需要注意的是DELIMITER //和DELIMITER ;两句,DELIMITER是分割符的意思,因为MySQL默认以";"为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。
(2)存储过程根据需要可能会有输入、输出、输入输出参数,这里有一个输出参数s,类型是int型,如果有多个参数用","分割开。
(3)过程体的开始与结束使用BEGIN与END进行标识。
(4)MySQL不支持Select Into语句直接备份表结构和数据,不支持:Select * Into new_table_name from old_table_name;
    替换方法1:
        create table dust select * from student;//用于复制前未创建新表dust的情况下
    替换方法2:
        insert into dust select * from student;//已经创建了新表dust的情况下

1.3参数

MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如:
CREATE PROCEDURE 过程名( [   [IN |OUT |INOUT ] 参数名 数据类形...  ] )

  • IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
  • OUT 输出参数:该值可在存储过程内部被改变,并可返回
  • INOUT 输入输出参数:调用时指定,并且可被改变和返回

1) IN参数例子
  1. mysql > DELIMITER //
  2. mysql > CREATE PROCEDURE demo_in_parameter(IN p_in int)
  3. -> BEGIN
  4. -> SELECT p_in;
  5. -> SET p_in=2;
  6. -> SELECT p_in;
  7. -> END;
  8. -> //
  9. mysql > DELIMITER ;


执行结果:

  1. mysql > SET @p_in=1;
  2. mysql > CALL demo_in_parameter(@p_in);
  3. +------+
  4. | p_in |
  5. +------+
  6. |   1  |
  7. +------+
  8. +------+
  9. | p_in |
  10. +------+
  11. |   2  |
  12. +------+
  13. mysql> SELECT @p_in;
  14. +-------+
  15. | @p_in |
  16. +-------+
  17. |  1    |
  18. +-------+

以上可以看出,p_in虽然在存储过程中被修改,但并不影响@p_id的值


2)OUT参数例子

  1. mysql > DELIMITER //
  2. mysql > CREATE PROCEDURE demo_out_parameter(OUT p_out int)
  3. -> BEGIN
  4. -> SELECT p_out;
  5. -> SET p_out=2;
  6. -> SELECT p_out;
  7. -> END;
  8. -> //
  9. mysql > DELIMITER ;

执行结果:

  1. mysql > SET @p_out=1;
  2. mysql > CALL sp_demo_out_parameter(@p_out);
  3. +-------+
  4. | p_out |
  5. +-------+
  6. | NULL  |
  7. +-------+
  8. +-------+
  9. | p_out |
  10. +-------+
  11. |   2   |
  12. +-------+
  13. mysql> SELECT @p_out;
  14. +-------+
  15. | p_out |
  16. +-------+
  17. |   2   |
  18. +-------+

3)
  1. mysql > DELIMITER //
  2. mysql > CREATE PROCEDURE demo_inout_parameter(INOUT p_inout int)
  3. -> BEGIN
  4. -> SELECT p_inout;
  5. -> SET p_inout=2;
  6. -> SELECT p_inout;
  7. -> END;
  8. -> //
  9. mysql > DELIMITER ;

执行结果:
;

  • mysql > CALL demo_inout_parameter(@p_inout) ;
  • +---------+
  • | p_inout |
  • +---------+
  • |    1    |
  • +---------+
  • +---------+
  • | p_inout |
  • +---------+
  • |    2    |
  • +---------+
  • mysql > SELECT @p_inout;
  • +----------+
  • | @p_inout |
  • +----------+
  • |    2     |
  • +----------+
  • 1.4变量

    1)定义变量
    DECLARE variable_name [,variable_name...] datatype [DEFAULT value];
    注:datatype为MySQL的数据类型,如:int, float, date, varchar(length)

    例如:

    1. DECLARE l_int int unsigned default 4000000;
    2. DECLARE l_numeric number(8,2) DEFAULT 9.95;
    3. DECLARE l_date date DEFAULT '1999-12-31';
    4. DECLARE l_datetime datetime DEFAULT '1999-12-31 23:59:59';
    5. DECLARE l_varchar varchar(255) DEFAULT 'This will not be padded';
    2)变量赋值
    SET 变量名 = 表达式值 [,variable_name = expression ...]
    3)用户变量
    • 在MySQL客户端使用用户变量
    1. mysql > SELECT 'Hello World' into @x;
    2. mysql > SELECT @x;
    3. +-------------+
    4. |   @x        |
    5. +-------------+
    6. Hello World |
    7. +-------------+
    8. mysql > SET @y='Goodbye Cruel World';
    9. mysql > SELECT @y;
    10. +---------------------+
    11. |     @y              |
    12. +---------------------+
    13. | Goodbye Cruel World |
    14. +---------------------+
    15. mysql > SET @z=1+2+3;
    16. mysql > SELECT @z;
    17. +------+
    18. | @z   |
    19. +------+
    20. |  6   |
    21. +------+
    • 在存储过程中使用用户变量
    1. mysql > CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World');
    2. mysql > SET @greeting='Hello';
    3. mysql > CALL GreetWorld( );
    4. +----------------------------+
    5. | CONCAT(@greeting,' World') |
    6. +----------------------------+
    7. |  Hello World               |
    8. +----------------------------+
    • 在存储过程间传递全局范围的用户变量

    ,即参数position必须大于等于1 
    例:

    1. mysql> select substring('abcd',0,2);
    2. +-----------------------+
    3. | substring('abcd',0,2) |
    4. +-----------------------+
    5. |                       |
    6. +-----------------------+
    7. 1 row in set (0.00 sec)
    8. mysql> select substring('abcd',1,2);
    9. +-----------------------+
    10. | substring('abcd',1,2) |
    11. +-----------------------+
    12. |     ab                |
    13. +-----------------------+
    14. 1 row in set (0.02 sec)
    TRIM([[BOTH|LEADING|TRAILING] [padding] FROM]string2) //去除指定位置的指定字符
    UCASE (string2 ) //转换成大写
    RIGHT(string2,length) //取string2最后length个字符
    SPACE(count) //生成count个空格

    (2).数学类

    ABS (number2 ) //绝对值
    BIN (decimal_number ) //十进制转二进制
    CEILING (number2 ) //向上取整
    CONV(number2,from_base,to_base) //进制转换
    FLOOR (number2 ) //向下取整
    FORMAT (number,decimal_places ) //保留小数位数
    HEX (DecimalNumber ) //转十六进制
    注:HEX()中可传入字符串,则返回其ASC-11码,如HEX('DEF')返回4142143
    也可以传入十进制整数,返回其十六进制编码,如HEX(25)返回19
    LEAST (number , number2 [,..]) //
    LEAST (number , number2 [,..]) //求最小值
    MOD (numerator ,denominator ) //求余
    POWER (number ,power ) //求指数
    RAND([seed]) //随机数

    ROUND (number [,decimals ]) //四舍五入,decimals为小数位数]
    注:返回类型并非均为整数,如:

    (1)默认变为整形值

    1. mysql> select round(1.23);
    2. +-------------+
    3. | round(1.23) |
    4. +-------------+
    5. |           1 |
    6. +-------------+
    7. 1 row in set (0.00 sec)
    8. mysql> select round(1.56);
    9. +-------------+
    10. | round(1.56) |
    11. +-------------+
    12. |           2 |
    13. +-------------+
    14. 1 row in set (0.00 sec)

    (2)可以设定小数位数,返回浮点型数据

    1. mysql> select round(1.567,2);
    2. +----------------+
    3. | round(1.567,2) |
    4. +----------------+
    5. |           1.57 |
    6. +----------------+
    7. 1 row in set (0.00 sec)

    (3).日期时间类

    ADDTIME (date2 ,time_interval ) //将time_interval加到date2
    CONVERT_TZ (datetime2 ,fromTZ ,toTZ ) //转换时区
    CURRENT_DATE ( ) //当前日期
    CURRENT_TIME ( ) //当前时间
    CURRENT_TIMESTAMP ( ) //当前时间戳
    DATE (datetime ) //返回datetime的日期部分
    DATE_ADD (date2 , INTERVAL d_value d_type ) //在date2中加上日期或时间
    DATE_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式显示datetime
    DATE_SUB (date2 , INTERVAL d_value d_type ) //在date2上减去一个时间
    DATEDIFF (date1 ,date2 ) //两个日期差
    DAY (date ) //返回日期的天
    DAYNAME (date ) //英文星期
    DAYOFWEEK (date ) //星期(1-7) ,1为星期天
    DAYOFYEAR (date ) //一年中的第几天
    EXTRACT (interval_name FROM date ) //从date中提取日期的指定部分
    MAKEDATE (year ,day ) //给出年及年中的第几天,生成日期串
    MAKETIME (hour ,minute ,second ) //生成时间串
    MONTHNAME (date ) //英文月份名
    NOW ( ) //当前时间
    SEC_TO_TIME (seconds ) //秒数转成时间
    STR_TO_DATE (string ,format ) //字串转成时间,以format格式显示
    TIMEDIFF (datetime1 ,datetime2 ) //两个时间差
    TIME_TO_SEC (time ) //时间转秒数]
    WEEK (date_time [,start_of_week ]) //第几周
    YEAR (datetime ) //年份
    DAYOFMONTH(datetime) //月的第几天
    HOUR(datetime) //小时
    LAST_DAY(date) //date的月的最后日期
    MICROSECOND(datetime) //微秒
    MONTH(datetime) //月
    MINUTE(datetime) //分返回符号,正负或0
    SQRT(number2) //开平方


    链接:


    【MySQL笔记】触发器,存储过程和函数的更多相关文章

    1. mysql 视图 触发器 存储过程 函数事务 索引

      mysql 视图 触发器 存储过程 函数事务 索引 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当 ...

    2. Mysql 视图,触发器,存储过程,函数,事务

      视图 视图虚拟表,是一个我们真实查询结果表,我们希望将某次查询出来的结果作为单独的一个表,就叫视图,无法对图字段内容进行增删改. --格式: CREATE VIEW 视图名字 AS 操作; --比如: ...

    3. MySQL中的存储过程、函数与触发器

      一.对待存储过程和函数的态度 优点: 1.存储过程只在创建时进行编译,sql语句则每次执行都需要编译.能提高数据库执行速度. 2.简单复杂操作结合事物一起封装. 3.复用性高. 4.安全性高,可指定存 ...

    4. pl/sql 笔记之存储过程、函数、包、触发器(下)

      一.存储过程.存储函数   1.What's This? ①.ORACLE 提供可以把 PL/SQL 程序存储在数据库中,并可以在任何地方来运行它.这样就叫存储过程或函数. ②.存储过程.存储函数的唯 ...

    5. MySQL教程之存储过程与函数

      存储程序分为存储过程和函数 可以使用CALL来调用存储过程,只能输出变量返回值.存储过程可以调用其他存储过程 函数可以从语句外调用,也能返回标量值 什么是存储过程? 简单的说,就是一组SQL语句集,功 ...

    6. MySQL中的存储过程和函数使用详解

      一.对待存储过程和函数的态度 在实际项目中应该尽量少用存储过程和函数,理由如下: 1.移植性差,在MySQL中的存储过程移植到sqlsever上就不一定可以用了. 2.调试麻烦,在db中报一个错误和在 ...

    7. MySQL基础值 存储过程和函数

      一.创建存储过程和函数 什么是创建存储过程和函数? 就是将经常使用的一组SQL语句组合在一起,并将这些SQL语句当做一个整体存储在MYSQL服务器中. 创建存储过程的语句是:CREATE  PROCE ...

    8. MySQL中的存储过程和函数

      存储过程和函数 简单的说,存储过程就是一条或者多条SQL语句的集合.可以视为批文件,但是其作用不仅仅局限于批处理.本文主要介绍如何创建存储过程和存储函数,以及如何调用.查看.修改.删除存储过程和存储函 ...

    9. MySQL存储过程和自定义函数、Navicat for mysql、创建存储过程和函数、调用存储过程和函数的区别

      1 MySQL存储过程和函数 过程和函数,它们被编译后保存在数据库中,称为持久性存储模块(Persistent Stored Module,PSM),可以反复调用,运行速度快. 1.1 存储过程 存储 ...

    10. <MySQL>入门七 存储过程和函数

      -- 存储过程和函数 /* 存储过程和函数:类似java中的方法 好处: 1.提高代码的重用性 2.简化操作 */ /* 存储过程 含义:一组预先编译好的SQL语句的集合.理解成批处理语句 1.提高代 ...

    随机推荐

    1. python碎片记录(一)

      1.python中求幂运算 2**31-1     2的31次方减一(32位整型数据范围为-2^31~2^31-1,最高位为符号位,负向值比正向值绝对值大1) 2.python中整数除法 x=x//1 ...

    2. mysql 设置字符集

      可以用:show create table table_name查看建表信息 也可用: show create database database_name查看建库信息 mysql> creat ...

    3. 仿照linux dpm机制,实现自己的dpm【转】

      转自:http://blog.csdn.net/lixiaojie1012/article/details/23788713 前边我们讨论分析了linux 内核的dpm实现,分析的目的在于学以致用:在 ...

    4. Timer类

      构造方法:public Timer() 创建一个新计时器.相关的线程不 作为守护程序运行. public Timer(boolean isDaemon) 创建一个新计时器,可以指定其相关的线程作为守护 ...

    5. mac10.9下安装Android

      这里记录一下mac下安装android比较快捷的方法 首先,到这里下载Android SDK,这个是集成的,所有工具一应俱全,免去了下载一堆东西的烦恼.具体包括如下: Eclipse + ADT pl ...

    6. jdbc预编译插入数据操作

      package com.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepare ...

    7. 当你用element-ui遇到需要在el-table-column上v-for时,这篇文章你能用的上,也就是你需要二级循环

      好链接就要丢过去 https://blog.csdn.net/qq_28929589/article/details/79445354

    8. LeetCode解题报告—— Median of Two Sorted Arrays

      There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...

    9. FFmpeg软件只是个解码编码软件,如果支持多种格式必须先安装好对应的库,下面就说下我装的库

      FFmpeg软件只是个解码编码软件,如果支持多种格式必须先安装好对应的库,下面就说下我装的库:1. 安装faad2 # wget http://downloads.sourceforge.net/fa ...

    10. javascript高程笔记:逻辑与和逻辑或

      逻辑与和或 逻辑与 当 && 前后两个操作数都是布尔值,无可厚非,同时为true才为true.与其他强类型语言不同的是,javascript逻辑与前后的操作数可以应用于任何类型. 而且 ...