MySQL视图,触发器,事务,存储过程,函数
create triggr triafterinsertcmdlog
after insert on cmd_log FOR EACH ROW
trigger_body
.#NEW : 代表新的记录
.#OLD : 代表老的记录
#准备表
CREATE TABLE CMD (
id INT PRIMARY KEY auto_increment,
user char(32),
priv char(10),
cmd char(64),
sub_time datetime, #提交时间
success enum('yes','no') #0代表NO
);
create table err_log(
id int primary key auto_increment,
err_cmd char(64),
err_time datetime
);
#创建触发器
delimiter //
create table tri_after_insert_cmd AFTER INSERT ON cmd FOR EACH ROW
begin
IF NEW.success = 'no' THEN #等值判断一个信号
INSERT INTO err_log(err_cmd,err_time) values(new.cmd. new.sub_time) #必须加分号
END IF; #必须加分号
END//
delimiter;
call 是调存储过程
3 . 事务 :
要么同时成立,要么同时不成立.
create table user( id int primary key auto_increment, name char(32), balance int );
insert into user(name,balance) values ('pp',6),('ww',6),('ff',6);
.#原子操作 start transaction; update user set balance = 2 where name = 'pp', update user set balance = 10 where name = 'ww'
4 . 存储过程
1. 程序与数据实现解耦
2. 减少网络传输的数据量
对于存储过程,可以接受参数,其参数有三种 :
1. in 仅用于传入参数用
2. out 仅用于返回值用
在python里面运行
import pymysql
conn = pymysql.connect(host = '127.0.0.1' , port = 5555 , user = 'root' , passwd = '123' , db = '...')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
#执行存储过程
cursor.callproc('p1',args=(1,2,3,4))
#获取执行完存储的参数
cursor.excute(?????????????????????)
res = cursor.fetchall()
conn.commit()
cursor.close()
conn.close()
print(result)
#建表
create table dep(
id int primary key auto_increment,
name char(32)
);
create table user(
id int primary key auto_increment,
name char(32),
dep_id int,
foreign key(dep_id) references dep(id)
);
insert into dep(name) values('外交部'),('公关部'),('')
#创建触发器的语法 :
CREATE
TRIGGER tregger_name
tregger_time trigger_event
ON tbl_name FOR EACH ROW
trigger_body
trigger_time : {BEFORE | AFTER}
trigger_event : {INSERT | UPDATE | DELETE}
#第一步 : 准备表
create table cmd_log(
id int primary key auto_increment,
cmd_name char(64),
sub_time datetime,
user_name char(32),
is_success enum('yes','no')
);
create table err_log(
id int primary key auto_increment,
cname char(64),
stime datetime
);
#第二步 : 创建触发器
delimiter //
CREATE
TRIGGER tri_after_insert_cmd_log
after insert
ON cmd_log FOR EACH ROW
BEGIN
if new.is_success = 'no' THEN
insert into err_log(cname,stime) values(new.cmd_name,new.sub_time);
end if ;
END //
delimiter ;
#测试
insert into cmd_log(cmd_name,sub_time,user,is_success) values
('ls -l /etc | grep *.conf',now(),'root','no'), #NEW.id,NEW.cmd_name,NEW.sub_time
('ps aux |grep mysqld',now(),'root','yes'),
('cat /etc/passwd |grep root',now(),'root','yes'),
('netstat -tunalp |grep 3306',now(),'egon','no');
########存储过程
#使用存储过程的优点 :
1. 程序与数据实现解耦
2. 减少网络传输的数量
#创建无参存储过程
delimiter //
create procedure p1()
begin
select * from test;
insert into test(username,dep_id) values('zsb',2);
end //
delimiter ;
#调用存储过程
call p1() ; #在mysql中调用
cursor.callproc('p1') #在python中通过pymysql模块调用
=============
对于存储过程,可以接受参数,参数有三类 :
#in 仅用于传入参数用
#out 仅用于返回值用
#inout 既可以传入又可以当做返回值
#创建有参存储过程之 in 的使用
delimiter //
create procedure p2(
in m int,
in n int)
begin
select * from test where id between m and n ;
end //
delimiter ;
#调用存储过程
call p2(3,7) ; #在mysql中调用
cursor.callproc('p2',args=(3,7)) #在python中通过pymysql模块调用
================
#创建有参存储过程之out的使用
delimiter //
create procedure p3(
in m int,
in n int,
out res int
)
BEGIN
select * from blog where id between m and n;
set res = 1;
END //
delimiter ;
#调用存储过程
#在mysql中调用
set @res=0; #0代表假(执行失败),1代表真(执行成功)
call p3(3,7,@res);
select @res;
#在python中基于pymysql调用
cursor.callproc('p3',(3,7,123)) #@_p3_0=3,@_p3_1=7,@_p3_2=123
print(cursor.fetchall()) #查询select的查询结果,只拿到存储过程中的select的查询结果
cursor.execute('select @_p3_0,@_p3_1,@_p3_2;') #@p3_0代表第一个参数,@p3_1代表第二个参数,即返回值
print(cursor.fetchall())
#===============================================
#创建有参存储过程之inout的使用
delimiter //
create procedure p4(
inout m int
)
begin
select * from test where id > m;
set m=1;
end //
delimiter ;
#在mysql中
set @x=2;
call p4(@x);
select @x;
delimiter //
create procedure p5(
inout m int
)
begin
select * from test11111111 where id > m;
set m=1;
end //
delimiter ;
set @x=2;
call p5(@x);
select @x;
#====================捕捉异常+事务===========================
delimiter //
create PROCEDURE p6(
OUT p_return_code tinyint
)
BEGIN
DECLARE exit handler for sqlexception
BEGIN
-- ERROR
set p_return_code = 1;
rollback;
END;
DECLARE exit handler for sqlwarning
BEGIN
-- WARNING
set p_return_code = 2;
rollback;
END;
START TRANSACTION;
insert into test(username,dep_id) values('egon',1);
DELETE from tb1111111; #执行失败
COMMIT;
-- SUCCESS
set p_return_code = 0; #0代表执行成功
END //
delimiter ;
#用python模拟
try:
START TRANSACTION;
DELETE from tb1; #执行失败
insert into blog(name,sub_time) values('yyy',now());
COMMIT;
set p_return_code = 0; #0代表执行成功
except sqlexception:
set p_return_code = 1;
rollback;
except sqlwaring:
set p_return_code = 2;
rollback;
mysql> show procedure status like 'p1%'; #查看某一类存储过程
#7. 流程控制
#函数中不要写sql语句,它仅仅是一个功能,是一个在sql中被应用的功能
#若要想在begin...end...中写sql,请用存储过程
delimiter //
create function f5(
i int
);
returns int
begin
declare res int default 0;
if i = 10 then
set res = 100;
elseif i = 20 then
set res = 200;
elseif i = 30 then
set res = 300;
else
set res = 400;
end if ;
return res ;
end //
dilimiter;
#while循环
delimiter //
create procedure proc_while();
begin
declare num int ;
set num = 0 ;
while num < 10 do
select
num ;
set num = num + 1 ;
end while ;
end //
delimiter ;
MySQL视图,触发器,事务,存储过程,函数的更多相关文章
- MySQL 视图触发器事务存储过程函数
事务 致命三问 什么是事务:开启了一个包含多条SQL语句的事务,这些SQL语句要么都执行成功,要么有别想成功:例如A向B转账,二人账户并不属于一家银行,在转账过程中由于网络问题,导致A显示转账 成功 ...
- MySQL 视图 触发器 事务 存储过程 函数 流程控制 索引与慢查询优化
视图 1.什么是视图? 视图就是通过查询得到的一张虚拟表,然后保存下来,下次可直接使用 2.为什么要使用视图? 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图? create view ...
- MySQL——视图/触发器/事务/存储过程/函数/流程控制
一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...
- mysql 视图 触发器 事物 存储过程 函数 流程控制
1.视图 *** 视图是有一条sql语句的查询结果构成的虚拟表 其不是物理存在的 使用方式与普通表相同 视图的作用1.简化sql语句的编写 2.限制可以查看的数据 可以使用权限来完成 权限某一个库 的 ...
- MySQL_视图/触发器/事务/存储过程/函数
视图.触发器.事务.存储过程.函数 视图 视图是一个虚拟表(非真实存在),其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用名称即可获取结果集,可以将该结果集当作表来使用 #创建视 ...
- MySQL拓展 视图,触发器,事务,存储过程,内置函数,流程控制,索引,慢查询优化,数据库三大设计范式
视图: 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图 create view tea ...
- python mysql 视图 触发器 事物 存储过程 用户授权 数据备份还原
###################总结########### 视图是一个虚拟表(非真实存在) 是跑在内存中的表,真实表是在硬盘上的表 使用视图我们可以把查询过程中的临时表摘出来,保存下来,用视图去 ...
- Python11/26--mysql之视图/触发器/事务/存储过程
视图: 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次用的时候直接使用即可 2.为什么用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何用视图 select * from ...
- mysql 视图 触发器 存储过程 函数事务 索引
mysql 视图 触发器 存储过程 函数事务 索引 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当 ...
随机推荐
- 深入常用CSS声明(一) —— Background
一直对一些自己常用的css声明掌握得不是很全,只知道常用的一些属性和值,但是对于其他的用法确实一知半解,这篇文章旨在扫盲,先不说有多深的理解,至少做到能够看到这些声明的属性和值的时候做到不陌生. 这里 ...
- SQL-Oracle内实现柱形图式的效果
在SQL SERVER内有一个函数replicate()可以实现柱形图效果,本质上是利用字符重复出现的次数来控制柱形图的长短,效果如图: 如果要在Oracle内实现相同的效果,则需要自己写一个函数: ...
- hdu 5288||2015多校联合第一场1001题
pid=5288">http://acm.hdu.edu.cn/showproblem.php?pid=5288 Problem Description OO has got a ar ...
- kafka入门样例 for java
1,生产者 import java.util.Properties; import kafka.javaapi.producer.Producer; import kafka.producer.Key ...
- springboot定时任务——整合Quartz
http://blog.csdn.net/liuchuanhong1/article/details/60873295 http://blog.csdn.net/lyg_come_on/article ...
- 自学Python5.2-类、模块、包
类.模块.包 一.类 类的概念在许多语言中出现,很容易理解.它将数据和操作进行封装,以便将来的复用. 二.模块module 通常模块为一个文件,直接使用import来导入就好了.可以作为module ...
- Java加密与解密笔记(二) 对称加密
前面的仅仅是做了编码或者摘要,下面看看真正的加密技术. DES public class DESUtil { static final String ALGORITHM = "DES&quo ...
- Selenium Python 安装指导
最近无聊.又重新装了个selenium 果然时代变了.安装的时候的方法和以前不太一样了.因此觉得有必要单列出来加以说明 另外备注:测试小伙伴们.安装此类工具报错.尝试以下两个方案之一: 1.请转sta ...
- win64环境下使用curl命令
想在windows环境下使用curl命令,其实很简单,简单配置如下: 工具下载 在官网下载工具包:https://curl.haxx.se/download.html 我这里下载的是zip版本的,下载 ...
- CentOS 7 学习(一) 配置LAMP和Nginx
CentOS 7 学习(一) 配置LAMP和Nginx CentOS是RedHat Linux企业版的代码编译版本,属于比较通用的服务器Linux版本,据说Ubuntu Server更通用,呵呵,不过 ...