MySQL高级(二)

时间:2026-10-28 09:27:13 来源:幸福记忆 作者:远方 阅读:39

一、触发器

定义:    触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象  

基本语法:

CREATE TRIGGER trigger_name trigger_time trigger_event
 ON tbl_name FOR EACH ROW trigger_stmt;
-------------------------------
说明:
trigger_time:触发程序的动作时间。它可以是BEFORE或AFTER,
             以指明触发程序是在激活它的语句之前或之后触发
trigger_event:写操作
   INSERT:将新行插入表时激活触发程序
   UPDATE:更改某一行时激活触发程序
   DELETE:从表中删除某一行时激活触发程序
trigger_stmt:可以使用别名OLD和NEW,引用与触发程序相关的表中的列:
   OLD.col_name在更新或删除它之前,引用已有行中的1列
   NEW.col_name在更新它之后引用将要插入的新行的1列或已有行的1列

案例:订单和库存  

CREATE TRIGGER ord_sub after insert on orders FOR EACH ROW
update products set pstock=pstock-new.count where pid=new.pid;

查看触发器:

SHOW TRIGGERS;

删除触发器:

DROP TRIGGER trigger_name;

二、mysql中的事务

事务的四个特性:

  • 原子性

该事务中的所有操作,是一个整体,不可分割;要么都执行,要么都不执行。

  • 一致性

执行前的数据与执行后的数据结果统一保持一致。要么都成功,要么都失败。

  • 隔离性

事务与事务之间的可见性:   1、未提交读  -- uncommit read   2、提交读 -- commit read   3、可重复读   4、串行化

  • 持久性

用法:   前提:当前表的存储引擎必须支持事务。  

步骤:    1、开启事务: start transaction    2、操作(insert,delete,update)    3、提交事务(commit)/回滚事务(rollback)

查看当前数据库中支持的存储引擎:

show engines;

三、sql编程

1、mysql中的变量

变量分为两类:  

  • 自定义变量:  

    • 局部变量: declare 变量名 类型(长度)

    • 用户变量:  @变量名

  • 系统变量:

    • 会话变量:@@session.变量名

    • 全局变量:@@global.变量名

2、mysql中的存储过程和函数

  • 存储过程

没有返回值的函数保存在数据库中-----存储过程。

基本语法:  

#创建存储过程-----------------------------------------------
CREATE PROCEDURE sp_name ([proc_parameter[,...]])
BEGIN
 逻辑代码(sql语句)
END

说明:
 sp_name: 过程名
 proc_parameter: 参数
     [IN|OUT|INOUT] 参数名 类型(长度);

 --如果在过程或函数中需要执行多条sql语句,则提前需要将mysql
 --语句的结束符修改防止冲突: delimiter //


#调用存储过程:----------------------------------------------
call 过程名称(参数列表)

案例1:计算两个数的和  

delimiter //
create procedure test_pro(in n1 int(5),in n2 int(5))
   -> begin
   -> select n1+n2;
   -> end//
delimiter ;

案例2:求和并设置输出类型参数

create procedure test_pro_out(in n1 int(5),in n2 int(5),out sum int(5))
begin
 set sum := n1+n2;
end//

查询存储过程:

show procedure status like '%num%';

删除存储过程:

drop procedure 过程名称
  • 函数

语法:

CREATE FUNCTION sp_name ([func_parameter[,...]])
    RETURNS type
    [characteristic ...] routine_body

说明:
  func_parameter: 函数参数(参数名 类型(长度))
  RETURNS: 表示函数的返回值类型

查看函数:

show function status like '%fun%';

删除函数:

DROP FUNCTION func_name;

函数调用:

函数名称(参数列表);

3、IF语句

IF search_condition THEN statement_list
    [ELSEIF search_condition THEN statement_list] ...
    [ELSE statement_list]
END IF

4、WHILE循环

[begin_label:] WHILE search_condition DO
    statement_list
END WHILE [end_label]

案例:

create procedure num_sum()
begin
 declare n int(10);
 declare sum int(10);
 set sum:=0;
 set n:=10;
 while n>=1 do
 set sum = sum+n;
 set n = n-1;
 end while;
 select sum;
end//

mysql中的游标:

CREATE PROCEDURE curdemo()
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE a CHAR(16);
  DECLARE b,c INT;
  #创建游标
  DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
  DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;

  #declare处理程序(出现02000状态值,执行CONTINUE,并且设置done的值为1)
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
  #打开游标
  OPEN cur1;
  OPEN cur2;

  #循环遍历
  REPEAT
    #从游标中提取数据到变量(声明游标的sql字段与此处的变量一一对应)
    FETCH cur1 INTO a, b;
    FETCH cur2 INTO c;
    IF NOT done THEN
       IF b < c THEN
          INSERT INTO test.t3 VALUES (a,b);
       ELSE
          INSERT INTO test.t3 VALUES (a,c);
       END IF;
    END IF;
  #直到done为true时,结束REPEAT遍历
  UNTIL done END REPEAT;
  #关闭游标
  CLOSE cur1;
  CLOSE cur2;
END

5、mysql中的预处理

当我们在编写存储过程或函数时,如果需要根据参数实现动态拼接sql语句并执行,则可以利用prepare这种方式实现,其基本语法如下:  

#准备预处理sql
PREPARE stmt_name FROM '自定义sql';
#执行预处理语句
EXECUTE stmt_name [USING @var_name [, @var_name] ...];
#释放连接
{DEALLOCATE | DROP} PREPARE stmt_name;