- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章MySql视图触发器存储过程详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
视图:
一个临时表被反复使用的时候,对这个临时表起一个别名,方便以后使用,就可以创建一个视图,别名就是视图的名称。视图只是一个虚拟的表,其中的数据是动态的从物理表中读出来的,所以物理表的变更回改变视图.
创建:
create view v1 as SQL 。
例如:create view v1 as select * from student where sid<10 。
创建后如果使用mysql终端可以看到一个叫v1的表,如果用navicate可以在视图中看到生成了一个v1的视图 。
再次使用时,可以直接使用查询表的方式。例如:select * from v1 。
修改:只能修改视图中的sql语句 。
alter view 视图名称 as sql 。
删除:
drop view 视图名称 。
触发器:
当对某张表做增删改查的时候(之前后者之后),就可以使用触发器自定义关联行为.
修改sql语句中的终止符号 delimiter 。
before after 之前之后 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
-- delimiter //
-- before或者after定义操作(insert或其他)之前或之后的操作
-- on 代表那张表发生操作后引发触发器操作
-- CREATE TRIGGER t1 BEFORE INSERT on teacher for EACH row
-- BEGIN
-- INSERT into course(cname) VALUES('奥特曼');
-- END //
-- delimiter ;
-- insert into teacher(tname) VALUES('triggertest111')
--
-- delimiter //
-- CREATE TRIGGER t1 BEFORE INSERT on student for EACH row
-- BEGIN
-- INSERT into teacher(tname) VALUES('奥特曼');
-- END //
-- delimiter ;
-- insert into student(gender,sname,class_id) VALUES('男','1小刚111',3);
-- 删除触发器
-- drop trigger t1;
-- NEW 和 OLD 代指新老数据 使其数据一致
-- delimiter //
-- create TRIGGER t1 BEFORE insert on student for each row
-- BEGIN
--这里的new 指定的是新插入的数据,old通常用在delete上
-- insert into teacher(tname) VALUES(NEW.sname);
-- end //
-- delimiter ;
insert
into
student(gender,sname,class_id)
VALUES
(
'男'
,
'蓝色的大螃蟹'
,3);
|
存储过程:
本质上就是一堆sql的集合,然后给这个集合起个别名。和view的区别就是,视图是一个sql查询语句当成一个表.
方式:
1 msyql----存储过程,供程序调用 。
2 msyql---不做存储过程,程序写sql 。
3 mysql--不做存储过程,程序写类和对象(转化成sql语句) 。
创建方法:
-- 1 创建无参数的存储过程 -- delimiter // -- create PROCEDURE p1() -- BEGIN -- select * from student; -- insert into teacher(tname) VALUES('cccc'); -- end // -- delimiter ,
-- 调用存储过程 。
1
|
call p2(5,2)<br data-filtered=
"filtered"
><br data-filtered=
"filtered"
><em id=
"__mceDel"
> pymysql中
cursor
.callproc(
'p1'
,(5,2))</em>
|
1
2
3
4
5
6
7
8
9
10
11
|
-- 2 带参数 in 参数
-- delimiter //
-- create PROCEDURE p2(
-- in n1 int,
-- in n2 int
-- )
-- BEGIN
-- select * from student where sid<n1;
--
-- end //<br data-filtered="filtered"><br data-filtered="filtered"> call p2(5,2)<br data-filtered="filtered"><br data-filtered="filtered"><em id="__mceDel"> pymysql中 cursor.callproc('p1',(5,2))</em>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
-- 3 out参数 在存储过程入参时 使用out则 该变量可以在外部进行调用
-- 存储过程中没有return 如果想要在外部调用变量则需要使用out
-- delimiter //
-- create PROCEDURE p3(
-- in n1 int,
-- out n2 int
-- )
-- BEGIN
-- set n2=444444;
-- select * from student where sid<n1;
--
-- end //
--
-- delimiter ;
--
-- set @v1=999 相当于 在session级别 创建一个变量
-- set @v1=999;
-- call p3(5,@v1);
-- select @v1; #通过传一个变量进去,然后监测这个变量就可以监测到存储过程是否执行成功
-- pymsyql中
--
-- cursor.callproc('p3',(5,2))
-- r2=cursor.fetchall()
-- print(r2)
--
-- 存储过程含有out关键字 如果想要拿到返回值 cursor.execute('select @_p3_0,@_p3_1')
-- # 其中 'select @_p3_0,@_p3_1'为固定写法 select @_存储过程名称_入参索引位置
-- cursor.execute('select @_p3_0,@_p3_1')
-- r3=cursor.fetchall()
-- print(r3)
--
|
为什么有了结果集,又要有out伪造返回的值?
因为存储过程中含有多个sql语句,无法判断所有的sql都能执行成功,利用out的特性来标识sql是否执行成功.
例如,如果成功标识为1 部分成功标识2 失败为3 。
存储过程中的事务:
事务:
被成为原子性操作。DML(insert,update,delete)语句共同完成,事物只和DML语句相关,或者锁只有DML才有事物.
事务的特点:
原子性 A :事务是最小单位,不可分割 。
一致性 C :事务要求所有dml语句操作的时候必须保证全部成功或者失败 。
隔离性 I : 事务A和事务B之间有隔离性 。
持久性 D : 是事务的保证,事务终结的标志(内存中的数据完全保存到硬盘中) 。
事务关键字:
开启事务:start transaction 。
事务结束 :end transaction 。
提交事务 :commit transaction 。
回滚事务 :rollback transaction 。
事务的基本操作 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
delimiter //
create
procedure
p5(
in
n1
int
,
out
n2
int
)
begin
1 声明如果出现异常执行(
set
n2=1;
rollback
;
)
2 开始事务
购买方账号-100
卖放账号+100
commit
3 结束
set
n2=2
end
//
delimiter ;
这样 既可以通过n2 检测后到错误 也可以回滚
以下是详细代码
delimiter //
create
procedure
p6(
out
code TINYINT
)
begin
声明如果碰到sqlexception 异常就执行下边的操作
DECLARE
exit HANDLER
for
SQLEXCEPTION
begin
--error
set
code=1;
rollback
;
end
;
START
TRANSACTION
;
delete
from
tb1;
insert
into
tb2(
name
)
values
(
'slkdjf'
)
commit
;
---success
code=2
end
//
delimiter ;
|
游标在存储过程中的使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
delimiter //
create
procedure
p7()
begin
declare
row_id
int
;
declare
row_num
int
;
declare
done
int
DEFAULT
FALSE
;
声明游标
declare
my_cursor
cursor
for
select
id,num
from
A;
声明如果没有数据 则将done置为
True
declare
continue
handler
for
not
found
set
done=
True
;
open
my_cursor; 打开游标
xxoo;LOOP 开启循环叫xxoo
fetch
my_cursor
into
row_id,row_num;
if done
then
如果done为
True
离开循环
leave xxoo;
end
if;
set
temp
=row_id+row_num;
insert
into
B(number)
VALUES
(
temp
);
end
loop xxoo; 关闭循环
close
my_cursor;
end
//
delimiter ;
以上代码 转化成python
for
row_id,row_num
in
my_cursor:
检测循环中是否还有数据,如果没有则跳出 break
break
insert
into
B(num)
values
(row_id+row_num)
|
动态的执行sql,数据库层面放置sql注入:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
delimiter \\
create
procedure
p6(
in
nid
int
)
begin
1 预编译(预检测)某个东西 sql语句合法性
2 sql=格式化tpl+arg
3 执行sql
set
@nid=nid
prepare
prod
from
'select * from student where sid>?'
EXECUTE
prod using @ nid;
deallocate
prepare
prod
end
\\
delimiter ;
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://www.cnblogs.com/yuan-x/p/12253062.html 。
最后此篇关于MySql视图触发器存储过程详解的文章就讲到这里了,如果你想了解更多关于MySql视图触发器存储过程详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
阅读目录 1、视图介绍 2、创建视图 3、查询视图 4、修改视图 5、删除视图 6、检查选项
基于函数的视图你已经get了,基于类的视图get了吗?CBV本质不知道?点进来看源码分析~ Django 视图之FBV 与 CBV FBV(function base views) 基于函数的视图,就
SQLite 视图(View) 视图(View)只不过是通过相关的名称存储在数据库中的一个 SQLite 语句。视图(View)实际上是一个以预定义的 SQLite 查询形式存在的表的组合。 视图
视图 什么是视图?视图的作用是什么? 视图(view)是一种虚拟存在的表,是一个逻辑表,它本身是不包含数据的。作为一个select语句保存在数据字典中的。 通过视图,可以展现基表(用来创建视图
代码如下: CREATE OR REPLACE VIEW BLOG_V_ADMIN (ID,NICKNAME,SEX,EMAIL,
创建视图 视图包含应用的 HTML 代码,并将应用的控制器逻辑和表现逻辑进行分离。视图文件存放在 resources/views 目录中。下面是一个简单的视图示例:
加密测试的存储过程 ? 1
简介数据库快照 数据库快照,正如其名称所示那样,是数据库在某一时间点的视图。是SQL Server在2005之后的版本引入的特性。快照
一 ,mysql事务 MYSQL中只有INNODB类型的数据表才能支持事务处理。 启动事务有两种方法 (1) 用begin,rollback,commit来实现 复制代码代码如
前言 在日常开发中,存储数据的最常用的方式便是数据库了,其中最为著名的便是MySQL数据库,因它简便易于上手而且可扩展性强大,跨平台使得它广为使用。上一篇文章,我们讲到了它的安装,今天我们就来
1、视图 视图:VIEW,虚表,保存有实表的查询结果,实际数据不保存在磁盘 物化视图:实际数据在磁盘中有保存,加快访问,MySQL不支持物化视图 基表:视图依赖的表 视图中的数据事实上
事项开启和使用 ? 1
代码如下: create PROCEDURE sp_decrypt(@objectName varchar(50)) AS begin begin tran&
前言 在之前 《Oracle打怪升级之路一》中我们主要介绍了Oracle的基础和Oracle常用查询及函数,这篇文章作为补充,主要介绍Oracle的对象,视图、序列、同义词、索引等,以及PL/SQL编
我是一名优秀的程序员,十分优秀!