mysql存储概述

1. 对象存放

  1. MySQL支持把几种对象存放在服务器端供以后使用。这几种对象有一些可以根据情况通过程序代码调用,有一些会在数据表被修改时自动执行,还有一些可以在预定时刻自动执行。它们可以分为以下几种。MySQL支持把几种对象存放在服务器端供以后使用。这几种对象有一些可以根据情况通过程序代码调用,有一些会在数据表被修改时自动执行,还有一些可以在预定时刻自动执行。它们可以分为以下几种。
  1. 存储函数(stored function):返回一个计算结果,该结果可以用在表达式里。
  2. 存储过程(stored procedure):不直接返回一个结果,但可以用来完成一般的运算或是生成一个结果集并传递回客户。
  3. 触发器(trigger):与数据表相关联,当那个数据表被INSERT、DELETE或UPDATE语句修改时,触发器将自动执行。
  4. 事件(event):根据时间表在预定时刻自动执行。

2. 复合语句和语句分隔符

使用复合语句时,必须考虑和解决这样一个问题:复合语句块里的语句必须以分号(;)彼此隔开,但因为分号同时也是mysql程序默认使用的语句分隔符,所以在使用mysql程序定义存储程序时会发生冲突。解决这个问题的办法是使用delimiter命令把mysql程序的语句分隔符重定义为另一个字符或字符串,它必须是在存储例程的定义里没有出现过的。这样一来,mysql程序就不会把分号解释为语句终止符了,它将把整个对象定义作为一条语句传递给服务器。在定义完存储程序之,可以把mysql程序的语句终止符重新定义为分号。下面的例子在定义一个存储过程时把mysql程序的默认分隔符临时改变为$,然后在恢复了mysql程序的默认分隔符之后执行了那个存储过程:

3. 存储过程

1. 存储过程和存储函数的区别
1. 使用存储过程的情况主要有两种:
(1)只需通过运算来实现某种效果或动作而无需返回一个值,
(2)运算会返回多个结果集(函数做不到这一点)。这只是些指导性建议,不是硬性规定。
2. 存储函数要用CREATE FUNCTION语句来创建,存储过程要用CREATE PROCEDURE语句来创建,为了与数据表或数据列的名字有所区别,给参数起名字时将使用p_前缀。

2. 分隔符,
由于mysql默认分隔符是 ; 如果我们使用了; 表示存储过程已经结束,但是mysql默认语句也是;结束,如果我们想要在存储过程中多加几个sql语句怎么办?我们需要先修改分割符,然后写sql语句和存储过程然后恢复到默认的分隔符。

mysql> delimiter $
	mysql> create procedure show_born()
	mysql> begin
	mysql> select 1;
	mysql> select 2;
	mysql> end$
	mysql> delimiter ;

3. 存储过程的调用
调用存储过程使用call命令调用 比如

mysql> call show_born();

4. 存储过程参数传入

delimiter $
create procedure p1 (p_id INT) begin select p_id; end$$
								#其默认类型将是IN ,即p1 (IN p_id INT)
set p_id =12$    			#传递值
call p1(@p_id)$  			#返回p_id的值

#(输出)
mysql> call p1(@p_id)$
+------+
| p_id |
+------+
|   12 |
+------+
begin select * from `test1` where test1=p_id; end   
					#返回 test1表中 test1列和p_id列中香港通的数据

5. 存储过程的参数类型

存储过程的参数分为3种类型。对于IN参数,调用者把一个值传递给过程,过程可以对这个值进行修改,但任何修改在过程返回后对调用者是不可见的。OUT参数刚好相反,过程把一个值赋值给OUT参数,这个值在过程返回后可以由调用者访问。INOUT参数允许调用者向过程传递一个值,然后再取回一个值。

要想明确地为参数指定类型,在参数表里把IN、OUT或INOUT写在参数名字前面即可。如果没有为参数指定类型,其默认类型将是IN。

在使用OUT或INOUT参数时,在调用过程时需要给出一个变量名。过程可以设置参数的值,相应的变量将在过程返回时获得那个值。如果想让某个存储过程返回多个结果值,OUT和INOUT参数类型将非常有用(存储函数只能返回一个值,不能胜任)。

#存储过程

1. 存储过程必须归属于 databases上面
2. 存储过程定义方式:

    create procedure show_users(); (show_users函数名 自定义)
    begin
    函数体
    end
    
 **begin-end用于定义一组语句块,在各大数据库中的客户端工具中可直接调用,但在mysql中不可**
 
3. 在制作存储过程的时候,切忌修改分隔符 delimiter $$

4. 在定义完成之后,切忌把分隔符修改回来

5. 调用存储过程 call show_users();

示例

定义
'''
delimiter $$									#修改分隔符为$
create procedure show_users1()				#创建触发事件show_users1()
begin											#语句开始
select host,user from mysql.user;			#查看mysql下面的user表里面的host和user列的信息
select host,db from mysql.db;			
end											#语句结束
$$
delimiter ;								#修改会默认分隔符;
'''

调用
call show_users1();				#触发

优点:
速度快: 在定义号存储过程的时候,mysql就已经把里面的语句
优化好了,他的速度是比你调用普通的select 这些要快的

缺点:
代码定死的 很难维护 其实还不如写在程序

5 示例
每次创建新值(数据行)的时候,新的数据列test2都会变成999

delimiter $$
create trigger test1_t before insert on test1 for each row begin set NEW.test2=999; end$$

**摘要如下 **

#存储过程

1. 存储过程必须归属于 databases上面
2. 存储过程定义方式:

    create procedure show_users(); (show_users函数名 自定义)
    begin
    函数体
    end
    
 **begin-end用于定义一组语句块,在各大数据库中的客户端工具中可直接调用,但在mysql中不可**
 
3. 在制作存储过程的时候,切忌修改分隔符 delimiter $$

4. 在定义完成之后,切忌把分隔符修改回来

5. 调用存储过程 call show_users();

示例

定义
'''```
delimiter $$									#修改分隔符
create procedure show_users1()				#创建触发事件show_users1()
begin											
select host,user from mysql.user;			#查看mysql下面的user表里面的host和user列的信息
select host,db from mysql.db;			
end										
$$
delimiter ;
'''```

调用
call show_users1();

3. 触发器

1. 说明:
触发器是与特定数据表相关联的存储过程,当相应的数据表被INSERT、DELETE或UPDATE语句修改时,触发器将自动执行。触发器可以被设置成在这几种语句处理每个数据行之前或之后触发。触发器的定义包括一条将在触发器被触发时执行的语句。

1.触发器可以检查或修改将被插入或用来更新数据行的新数据值。
这意味着我们可以利用触发器强制实现数据的完整性,
比如检查某个百分比数值是不是落在了0到100的区间内。
触发器还可以用来对输入数据进行必要的过滤。

2. 触发器可以把表达式的结果赋值给数据列作为其默认值。
这使我们可以绕开数据列定义里的默认值必须是常数的限制。

3. 触发器可以在删除或修改数据行之前先检查它的当前内容。
这种能力可以用来实现许多功能,例如把对现有数据行的修改记载到一个日志里。

注意事项:
触发器要用CREATE TRIGGER语句来创建。在触发器的定义里需要表明它将由哪种语句(INSERT、UPDATE或DELETE)触发,是在数据行被修改之前还是之后被触发。 触发器要用CREATE TRIGGER语句来创建。在触发器的定义里需要表明它将由哪种语句(INSERT、UPDATE或DELETE)触发,是在数据行被修改之前还是之后被触发。

#触发器

1. 修改分隔符
2. create trigger +触发器名称
3. begin  执行语句 end
4. 调用 (自动调用满足条件之后自动)

#触发器的原理

在数据被更新之前还是之后 before after
什么操作去执行触发  insert update ....
监听什么表该触发  on table


'''
delimiter $$
create trigger add_salary
before insert on employee
for each row
BEGIN
set NEW.salary = NEW.salary + 1000;
end
$$
delimiter ;
'''

查看触发器
show TRIGGERS;

4. 事件

  1. 说明:
    1 我们可以把数据库操作安排在预定时间执行。事件是与一个时间表相关联的存储程序,时间表用来定义事件发生的时间、次数以及何时消失。事件非常适合用来执行各种无人值守的系统管理任务,如定期更新汇总报告、清理过期失效的数据、对日志数据表进行轮转等。
    2在默认的情况下,事件调度器不会运行。如果你想使用事件,必须先启用事件调度器。把以下语句添加到一个选项文件中(服务器在启动时将读取):2. 在默认的情况下,事件调度器不会运行。如果你想使用事件,必须先启用事件调度器。把以下语句添加到一个选项文件中(服务器在启动时将读取):
    [mysqld]
    event_scheduler=ON
    3 如果你想在系统运行时查看事件调度器的状态,可以使用这条语句:
show variables like 'event_scheduler'

若你想在系统运行时停止或启动事件调度器,可以通过改变event_scheduler系统变量的值来达到目的(它是一个GLOBAL变量,你必须拥有SUPER权限才能修改它):

mysql> set GLOBAL event_scheduler = ON;       #开启时间调度器
  1. 实际使用
mysql> create event e1 on schedule every 5 second do insert into test1 (test1)values('8888');
  #DO子句负责定义事件的语句体部分

如果想创建一个只执行一次的事件,就应该使用AT调度类型而不是EVERY。如下所示的定义将创建一个只执行一次的事件,在一个小时后执行:

mysql> create event e2 on schedule at current_timestamp + interval 5 minute do select 1;

如果你想禁用某个事件,让它不再定期执行,或者重新激活某个已被禁用的事件,请使用ALTER EVENT语句:

alter event e1 disable;
alter event e1 enable;