一、触发器

触发器(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) //开平方


    链接:


    最新文章

    1. 一步步学习javascript基础篇(3):Object、Function等引用类型
    2. ASP.NET页面事件:顺序与回传详解
    3. 【自然框架】终于把源码弄到git上了。
    4. WPF之 DataGrid数据绑定
    5. Java跟C.C++相互调用
    6. [wikioi]数的划分
    7. id和instancetype的异同
    8. 重新绑定ItemsSource先设置ItemsSource = null;的原因
    9. github+hexo搭建自己的博客网站(一)基础入门
    10. hdu 4939
    11. android-async-http详解
    12. Docker的使用
    13. kubernetes 将pod运行在某些特定的节点上,给节点打标签
    14. 将对象序列化成XML字符串
    15. H5 20-属性选择器上
    16. AXI总线(转)
    17. Swift代理造成内存泄漏的解决办法
    18. acceptorThreadCount
    19. Vue前端数据采集 埋点 追踪用户系列行为
    20. 微信浏览器禁止app下载链接的两种处理方法

    热门文章

    1. [Leetcode Week13]Search a 2D Matrix
    2. codevs 1038 一元三次方程求解 NOIP2001提高组
    3. 图论-最小生成树-Kruskal算法
    4. linux 系统调用fork()
    5. Hierarchical Attention Based Semi-supervised Network Representation Learning
    6. HDU-5273
    7. sharding-JDBC 实现读写分离
    8. False Positives和False Negative等含义
    9. Java中分拣存储的demo
    10. 关于hadoop处理大量小文件情况的解决方法