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 之前之后

-- 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 ;

-- 调用存储过程

 call p2(5,2)

 pymysql中  cursor.callproc(‘p1‘,(5,2))

  

--   2 带参数 in 参数

-- delimiter //
-- create PROCEDURE p2(
--   in n1 int,
-- 	in n2 int
-- )
-- BEGIN
--    select * from student where sid<n1;
--
-- end //

 call p2(5,2)

 pymysql中  cursor.callproc(‘p1‘,(5,2))

  

--  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

    

    事务的基本操作

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 ;

    游标在存储过程中的使用:

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注入:

动态的执行sql  数据库层面防止sql注入
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

时间: 2024-10-29 04:33:58

MySql中的视图 触发器 存储过程,以及事物的相关文章

视图 触发器 存储过程 函数 流程过程 索引 慢查询

视图 触发器 存储过程 函数 流程过程 索引 慢查询 视图 触发器 事务 存储过程 内置函数 流程控制 索引 视图 1.什么是视图 ? 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 ? 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何用视图 create view teacher2course as select * from teacher inner join course on teacher.tid = course.teacher_id; 强调

Mysql学习---视图/触发器/存储过程/函数/索引 180101

视图 视图: 视图是一个虚拟表(非真实存在),动态获取数据,仅仅能做查询操作 本质:[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用.由于视图是虚拟表,所以无法使用其对真实表进行创建.更新和删除操作,PyMysql是支持视图的. 仅能做查询用. 创建视图: create VIEW stu as select * from student; # 这里只是建立了一个对应关系,视图是虚表,动态获取数据 select * from stu;

mysql中索引,触发器,事务,存储引擎的理解

1.索引:作用于表中的某列,并将其进行排序,有助于快速地进行查询. 索引是对数据库表中一个或多个列的值进行排序的数据结构,是用于提高在数据库表中访问数据的速度的数据库对象.其实索引相当于一本书的目录,如果没有索引,要想在数据库中查找某一特定的值就需要遍历整个数据库表,但是有了索引之后就可以在索引当中查找,有助于更快地获取信息: 索引可分为聚集索引和非聚集索引: 聚集索引:是按照数据存放的物理位置为顺序的: 非聚集索引中,表数据存储顺序与索引顺序无关:一张表上只能创建一个聚集索引,因为真实数据的物

数据库 --- 40 视图 触发器 存储过程 事务 函数

一.视图  (view) 视图是一种虚拟表,可以把查询出来的临时表保存下来 1.创建视图 2.删除视图 3.修改视图,(原始表的记录也跟着修改) 4.查看视图 二.  触发器(trigger)可进行  增删改  操作 1.创建触发器 2.删除触发器 实例: 三.存储过程  1. 优点: 缺点: 2.程序与数据库结合使用的三种方式 3.创建简单存储过程(无参) 4.创建存储过程(有参) ① in  传入参数 ② out  返回值 #查看存储过程的一些信息:show create procedure

在Navicat for MySQL中打开视图时,提示视图没有主键的问题

一直把视图理解为一个select语句而已,视图一般就是用于查询,不会通过视图来更新表或视图本身的数据,所以视图根本不需要什么主键.今天自己建了一个视图view_test: drop view if exists view_test create view view_test as select a.c1,a.c2, b.c1,b.c2, c.c1,c.c2, d.c1,d.c2 from table_A a join teble_B b on a.c3=b.c3 join table_C c o

MySQL 中如何在触发器里中断记录的插入或更新?

MySQL 不象其它有些数据库可以在触发器中抛出异常来中断当然触发器的执行以阻止相应的SQL语句的执行.在MySQL的目录版本中还无法直接抛出异常.这样我们如何实现呢? 下面是一种实现的方法.思路就是想办法在触发器中利用一个出错的语句来中断代码的执行. mysql> create table t_control(id int primary key);Query OK, 0 rows affected (0.11 sec) mysql> insert into t_control values

mysql中的视图

一.创建视图 create [algorithm = 视图算法]  view 视图名 as select 语句;  -- 可以是任何查询语句(普通查询.连接查询.联合查询.子查询) 有三种视图算法选项: 1. undefined:默认设置,表示没有指定算法,一般此选项会自动指定为merge. 2. temptable:临时表算法,系统先执行视图封装的select语句,再执行视图外部的select语句,因要执行两次查询语句,所以效率相对低一些. 3. merge:合并算法,系统将视图封装的sele

(8)MySQL中的视图

概念 ??视图是一种虚拟存在的表,对于使用视图的用户来说,基本上跟使用正常的表一样.视图在数据库中是不存在的,视图中的数据是动态生成的. ??视图相对于普通表的优势: 简单:使用视图不需要关心后面的表的对应结构条件,对于使用者来说,视图是过滤好的结果集. 安全:使用者只能访问他们被允许查询的结果集. 数据独立:一旦视图结构确定,对实际表的改变对视图使用者是没有影响的. 视图操作 视图操作分为创建视图.修改视图.删除视图.查看视图定义. 创建视图,修改视图 #创建视图 create [or rep

mysql中的视图--数据操作

一.新增数据 insert into 视图名 [(字段列表)] values(值列表); 注: 1. 多表视图不能新增数据. 2. 单表视图拥有基表所有不能为空或没有默认值的字段才能新增数据. 二.删除数据 delete from 视图名 [where 条件]; 注: 多表视图不能删除数据. 三.更新数据 理论上多表和单表视图都可以更新数据. 可以在创建视图是添加更新限制: with check option create view 表名 as select语句 where 条件 with ch