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
beginIF 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 pymysqlconn = 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('外交部'),('公关部'),('')#创建触发器的语法 :
CREATETRIGGER tregger_nametregger_time trigger_eventON tbl_name FOR EACH ROWtrigger_bodytrigger_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 //CREATETRIGGER tri_after_insert_cmd_logafter insertON cmd_log FOR EACH ROW
BEGIN if new.is_success = 'no' THENinsert 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()
beginselect * 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
)
BEGINselect * 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
)
beginselect * 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
)
beginselect * 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
)
BEGINDECLARE exit handler for sqlexceptionBEGIN-- ERRORset p_return_code = 1;rollback;END;DECLARE exit handler for sqlwarningBEGIN-- WARNINGset p_return_code = 2;rollback;END;START TRANSACTION;insert into test(username,dep_id) values('egon',1);DELETE from tb1111111; #执行失败COMMIT;-- SUCCESSset 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 thenset res = 200;elseif i = 30 thenset res = 300;else set res = 400;end if ;return res ;end //
dilimiter;#while循环
delimiter //
create procedure proc_while();
begindeclare num int ;set num = 0 ;while num < 10 doselect num ;set num = num + 1 ;end while ;end //
delimiter ;

转载于:https://www.cnblogs.com/ugfly/p/7544029.html

MySQL视图,触发器,事务,存储过程,函数相关推荐

  1. MySQL-视图-触发器-事务-存储过程-函数-流程控制-索引与慢查询优化-06

    目录 视图*** 什么是视图 为什么要用视图 如何生成视图 修改视图 --> 最好(千万)不要 关联表数据改动前 关联表数据改动之后 触发器 什么是触发器 触发条件 触发器语法结构 修改mysq ...

  2. MySQL视图触发器存储过程内外链接数据锁

    MySQL视图触发器存储过程内外链接数据锁 视图 什么是视图 是一个虚拟表,其内容由查询定义.同真实的一样,视图包含一系列带有名称的列和行数据 视图有什么用 视图的作用就是缓存数据,可以这么理解,我把 ...

  3. 数据库原理实验五——触发器与存储过程(函数)

    实验目的 熟练掌握存储过程/函数的创建和执行方法. 熟练掌握触发器的创建和执行方法. 实验内容 针对SPJ_MNG数据库,创建并执行如下存储过程.(共计40分) (1) 创建一个没有参数的存储过程-j ...

  4. mysql 视图操作和存储过程

    1.mysql 视图的操作是在新版本数据库才支持的,视图操作的好处是可以简化数据库的查询,特别是一些经常查询的数据表我们可以先创建一个视图,以后要在查询这个类式 的数据表时候,就可以直接查询该视图.这 ...

  5. MySQL视图、事务与存储过程

    一.可视化工具的使用方法 简述:首先我们使用数据库可视化工具是为了让我们在建立数据库的时候能够减少代码的书写从而提升我们编写程序的效率,而我使用的是Navicat工具是因为使用它基本为无脑操作我就不过 ...

  6. mysql 视图触发器,MySql视图触发器存储过程详解

    一个临时表被反复使用的时候,对这个临时表起一个别名,方便以后使用,就可以创建一个视图,别名就是视图的名称.视图只是一个虚拟的表,其中的数据是动态的从物理表中读出来的,所以物理表的变更回改变视图. 创建 ...

  7. mysql触发器_MySQL视图\触发器\事务初步认识

    视图 什么是视图? 视图就是通过查询得到虚拟表,然后将虚拟表保存下来,下次可以直接使用 为什么用视图? 如果要频繁的操作一张虚拟表,你就可以将该虚拟表制作成视图,后续可以直接进行操作 如何用视图 固定 ...

  8. mysql视图管理和存储过程

    视图 虚拟表 视图限制: 1.不能创建索引 不能使用子查询 包含聚合函数的视图是不可更新的 create view 视图名称 as sql查询 create view 视图名称(字段名列表) as s ...

  9. mysql 1422_mysql触发器调用存储过程,报1422错

    --------------------------------触发器创建新分类触发存储过程-----------------------------DROPTRIGGERIFEXISTScatego ...

最新文章

  1. 如果给你机会,阿里巴巴的中层职位和马云的专属司机,你怎么选?
  2. 颠覆教科书:打破50年来的认知,DNA同义突变会影响蛋白质折叠,进而影响细胞生长...
  3. 朱啸虎回应“美团滴滴合并”;小米成世界第四大手机制造商;Ant Design 3.26.1 发布 | 极客头条...
  4. 同样是程序员,为什么别人比你更优秀?
  5. 解决 gcc/g++ 编译动态库通过却无法运行的问题
  6. CF984D XOR-pyramid
  7. rx584白牌救砖心得
  8. Linux C/C++之TCP / UDP通信
  9. CMD 命令行实现 Windows 下复制文件到文件夹下的所有文件夹
  10. Http 资源服务器 搭建 HFS
  11. 2016跨境电商五大物流模式
  12. vue打包导致浏览器崩溃的解决方法
  13. 测试 CS4344 立体声DA转换器
  14. go语言输出汉字的数量
  15. 基于FPGA的数字密码锁电路设计(含程序)
  16. 89.网络安全渗透测试—[常规漏洞挖掘与利用篇5]—[文件包含漏洞详解实战示例]
  17. AVOD:Aggregate View Object Detection跑通(官方README小补充)
  18. 基于MessageSolution 邮件归档系统EEA的通用型信息泄露漏洞挖洞
  19. 视频化表达“吞噬”互联网,文本信息逐渐被替代?
  20. 对象的调用和构造函数

热门文章

  1. Java System.getProperty()
  2. eval函数python_Python eval()函数
  3. 开课吧课堂:Java的内置异常汇总列表!
  4. Java基础篇:if控制语句
  5. 区块链支付平台技术的应用
  6. react-native开发安卓app相关使用总结
  7. maven3实战之设置HTTP代理
  8. WEB 开发前传——js笔记
  9. PyTorch出现RuntimeError: Function AddBackward0 returned an invalid gradient at index 1
  10. 配置iSCSI部署网络存储