视图:

视图,虚拟表

创建虚拟表:

  1. # 语法:
  2. # create view 虚拟表名称 as 虚拟表;
  3. create view course_and_teacher as select * from course inner join teacher on course.teacher_id = teacher.tid;
  4.  
  5. # 虚拟表在硬盘上存储时,只有 表结构, 没有 表数据 那张表,即 只有 course_and_teacher.frm 这个文件;因为虚拟表的数据来自于其它表
  6.  
  7. # 创建的虚拟表可以直接使用:
  8. select * from course_and_teacher;
  9. # 每次使用 course_and_teacher 这张表时,都会触发 select * from course inner join teacher on course.teacher_id = teacher.tid;
  10.  
  11. # 虚拟表不建议使用,因为 如果 你在数据库建了大量的视图,不利用扩展(数据库可能经常需要扩展;即强耦合);所以尽量用原生的 SQL
  12.  
  13. # 另外,视图是用来查询的,不能用来修改(不要修改视图中的记录)
  14.  
  15. # 修改视图:
  16. # 语法: alert view 视图名称 as SQL语句;
  17. alert view course_and_teacher as select * from course where cid>3;
  18.  
  19. # 删除视图:
  20. # 语法: drop view 视图名称;
  21. drop view course_and_teacher;

触发器:

一碰就动;使用触发器可以定制用户对表 【增、删、改】操作时前后的行为(注意:没有查询)

  1. # 一、创建触发器:
  2.  
  3. # 针对 insert 可以是 before insert(对于每一行,在 insert 行为之前,去触发一个 begin.. end 之间的 SQL语句), 也可以是 after insert (对于每一行,在 insert 行为之后,去触发一个 begin.. end 之间的 SQL语句)
  4.  
  5. # 语法(插入前):
  6. # create trigger 触发器名称 before insert on 表名 for each row
  7. # begin ... end
  8.  
  9. # 插入前:
  10. create trigger tri_before_insert_tb1 before insert on tb1 for each row
  11. begin
  12. ...
  13. end
  14. # 插入后:
  15. create trigger tri_after_insert_tb1 after insert on tb1 for each row
  16. begin
  17. ...
  18. end
  19.  
  20. # 删除前:
  21. create trigger tri_before_delete_tb1 before delete on tb1 for each row
  22. begin
  23. ...
  24. end
  25. # 删除后:
  26. create trigger tri_after_delete_tb1 after delete on tb1 for each row
  27. begin
  28. ...
  29. end
  30.  
  31. # 更新前:
  32. create trigger tri_before_update_tb1 before update on tb1 for each row
  33. begin
  34. ...
  35. end
  36. # 更新后:
  37. create trigger tri_after_update_tb1 after update on tb1 for each row
  38. begin
  39. ...
  40. end

示例:

  1. # 准备表:
  2. create table cmd(
  3. id int primary key auto_increment,
  4. user char(32), # 执行命令的用户
  5. priv char(10), # 该用户的权限
  6. cmd char(64), # 执行的命令
  7. sub_time datetime, # 提交时间
  8. success enum ('yes','no') # 0代表执行失败
  9. );
  10.  
  11. create table errlog( # 记录命令出错的表
  12. id int primary key auto_increment,
  13. err_cmd char(64), # 命令名
  14. err_time datetime, # 错误命令的提交时间
  15. );
  16.  
  17. # 创建触发器
  18. delimiter // # delimiter 用于声明 SQL语句的结束符 是 “//”,而不是 “;”
  19. create trigger tri_after_insert_cmd after insert on cmd for each row
  20. BEGIN
  21. # 触发器提供了两个对象:NEW 和 OLD;NEW代表新增的记录,OLD代表以前老的记录(插入行为没有 OLD 一说,因为插入的永远都是 新的;修改的情况下,才有老的记录,同 NEW 也能派上用场)
  22. if NEW.success = 'no' THEN # 等值判断只有一个等号; NEW.success 表示 NEW对象的 success 属性
  23. insert into errlog(err_cmd,err_time) values(NEW.cmd,NEW.sub_time); # 必须加分号
  24. end if; # 必须加分号
  25. END// # 此处的 “//” 表示 触发器定义完了
  26. delimiter ; # 重新声明 SQL语句 的结束符 为 “;”
  27.  
  28. # NEW 表示即将插入的数据行,OLD 表示即将删除的数据行
  29. # 触发器是 MySQL 的一个内置功能;我们也可以在 应用程序级别 自己去实现 触发器的功能,如利用 python 代码自己去实现
  30.  
  31. # 建议在 应用程序级别去实现 触发器的功能;方便以后扩展功能
  32.  
  33. # 使用触发器: 触发器无法由用户直接调用,而是由于对 表的 【增、删、改】 操作被动引发的
  34. # 删除触发器:
  35. drop trigger tri_after_insert_cmd;
  36. # 查看触发器:
  37. show triggers;

存储过程:

  1. 存储过程包含了一系列可执行的 sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆 sql
  2. 优点:
  3. 1. 用于替代程序写的SQL语句,实现程序与sql解耦
  4. 2. 基于网络传输,传别名的数据量小,而直接传sql数据量大
  5. 缺点:
  6. 程序扩展功能不方便

示例:

  1. # 调用存储过程
  2. # MySQL中调用:
  3. call p1();
  4.  
  5. # python中调用:
  6. cursor.callproc('p1') # 用 cursor 去调用 callproc('存储过程的名称') 方法
  7. # 如果 存储过程中是查询语句,利用相应的方法去获取相应的结果:
  8. print(cursor.fetchall())
  9.  
  10. # 有参
  11. delimiter //
  12. create procedure p2(in n1 int,in n2 int,out res int) # 1. MySQL中的存储过程,参数必须指定 参数类型;2. 参数必须指明是用来接收值的,还是用来返回值的:in 代表传入参数, out表示返回参数,inout表示可进可出
  13. BEGIN
  14. select * from db7.student where tid>n1 and tid<n2;
  15. set res = 1; # set 设置返回值
  16. END //
  17. delimiter ;
  18. # MySQL 中调用:
  19. set @x=0 # 设置变量的初始值
  20. call p2(2,5,@x); # 传参
  21. select @x; # 查看 返回值
  22. # python 中调用:
  23. cursor.callproc('p2',(2,5,0)) # callproc 在执行该存储过程的时候会把参数做转换: @_p2_0=2, @_p2_1=5, @_p2_2=0
  24. # 如果 存储过程中是查询语句,利用相应的方法去获取相应的结果:
  25. print(cursor.fetchall())
  26. # 查看返回结果
  27. cursor.execute('select @_p2_2')
  28. print(cursor.fetchone())

应用程序与数据库结合使用的三种方式:

  1. 方式一:
  2. MySQL:编写存储过程
  3. Python:调用存储过程
  4.  
  5. 方式二:
  6. Python:编写纯生SQL
  7. MySQL:啥也不干
  8.  
  9. 方式三:
  10. PythonORM
  11. MySQL:啥也不干

事务:

事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性

示例:

  1. # 建表
  2. create table user(
  3. id int primary key auto_increment,
  4. name char(32),
  5. balance int
  6. );
  7.  
  8. # 插入数据
  9. insert into user(name,balance)
  10. values
  11. ('wsb',1000),
  12. ('egon',1000),
  13. ('ysb',1000);
  14.  
  15. #原子操作
  16. start transaction; # 开启事务
  17. update user set balance=900 where name='wsb'; #买支付100元
  18. update user set balance=1010 where name='egon'; #中介拿走10元
  19. update user set balance=1090 where name='ysb'; #卖家拿到90元
  20. commit;
  21.  
  22. #出现异常,回滚到初始状态
  23. start transaction;
  24. update user set balance=900 where name='wsb'; #买支付100元
  25. update user set balance=1010 where name='egon'; #中介拿走10元
  26. uppdate user set balance=1090 where name='ysb'; #卖家拿到90元,出现异常没有拿到
  27. # rollback; # 上述 update 操作的数据只是保存在内存中,此时 rollback 能让数据回滚到最初的状态;commit之后 rollback 就没有作用了
  28. commit; # 想让内存的数据保存到 数据库中,则需要 commit
  29. mysql> select * from user;
  30.  
  31. +----+------+---------+
  32. | id | name | balance |
  33. +----+------+---------+
  34. | 1 | wsb | 1000 |
  35. | 2 | egon | 1000 |
  36. | 3 | ysb | 1000 |
  37. +----+------+---------+
  38. rows in set (0.00 sec)

使用:

  1. #思路:
  2. delimiter //
  3. create procedure p4(
  4. out status int
  5. )
  6. BEGIN
  7. 1. 声明如果出现异常则执行{
  8. set status = 1;
  9. rollback;
  10. }
  11.  
  12. 开始事务
  13. -- 由秦兵账户减去100
  14. -- 方少伟账户加90
  15. -- 张根账户加10
  16. commit;
  17. 结束
  18.  
  19. set status = 2;
  20.  
  21. END //
  22. delimiter ;
  23.  
  24. #实现
  25. delimiter //
  26. create PROCEDURE p5(
  27. OUT p_return_code tinyint
  28. )
  29. BEGIN
  30. DECLARE exit handler for sqlexception # 声明异常处理
  31. BEGIN
  32. -- ERROR
  33. set p_return_code = 1;
  34. rollback; # 有异常则回滚
  35. END;
  36.  
  37. DECLARE exit handler for sqlwarning # 声明警告处理
  38. BEGIN
  39. -- WARNING
  40. set p_return_code = 2;
  41. rollback; # 有警告则回滚
  42. END;
  43.  
  44. START TRANSACTION; # 开启事务
  45. DELETE from tb1;
  46. insert into blog(name,sub_time) values('yyy',now());
  47. COMMIT;
  48.  
  49. -- SUCCESS
  50. set p_return_code = 0; #0代表执行成功
  51.  
  52. END //
  53. delimiter ;

python的事务开启:

示例一:

  1. # coding=utf-8
  2. import pymysql
  3.  
  4. #添加数据
  5.  
  6. conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='', db='yyy')
  7.  
  8. cursor = conn.cursor()
  9.  
  10. try:
  11. insertSQL0="INSERT INTO ACCOUNT2 (name,balance) VALUES ('bart',1000)"
  12. insertSQL1="UPDATE account2 set balance=balance-30 WHERE name='alex'"
  13. insertSQL2="UPDATE account2 set balance=balance+30 WHERE name='ego'"
  14.  
  15. cursor.execute(insertSQL0)
  16. conn.commit()
  17.  
  18. cursor.execute(insertSQL1)
  19. raise Exception #模拟出现错误
  20. cursor.execute(insertSQL2)
  21. cursor.close()
  22. conn.commit()
  23.  
  24. except Exception as e:
  25. conn.rollback() #回滚
  26. conn.commit()
  27.  
  28. cursor.close()
  29. conn.close()

示例二:

  1. try:
  2. cursor.execute(sql_1)
  3. cursor.execute(sql_2)
  4. cursor.execute(sql_3)
  5. except Exception as e:
  6. connect.rollback() # 事务回滚
  7. print('事务处理失败', e)
  8. else:
  9. connect.commit() # 事务提交
  10. print('事务处理成功', cursor.rowcount) # cursor.rowcount 是一个只读属性,返回执行execute()方法后影响的行数。
  11. # 关闭连接
  12. cursor.close()
  13. connect.close()

MySQL:视图、触发器、存储过程、事务的更多相关文章

  1. mysql 视图 触发器 存储过程 函数事务 索引

    mysql 视图 触发器 存储过程 函数事务 索引 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当 ...

  2. Mysql 视图,触发器,存储过程,函数,事务

    视图 视图虚拟表,是一个我们真实查询结果表,我们希望将某次查询出来的结果作为单独的一个表,就叫视图,无法对图字段内容进行增删改. --格式: CREATE VIEW 视图名字 AS 操作; --比如: ...

  3. Mysql 视图 游标 触发器 存储过程 事务

    Mysql 视图 触发器 存储过程 游标 游标是从数据表中提取出来的数据,以临时表的形式存放在内存中,在游标中有一个数据指针,在初始状态下指向的是首记录,利用fetch语句可以移动该指针,从而对游标中 ...

  4. day40 mycql 视图,触发器,存储过程,函数

    视图,触发器,存储过程,自定义函数 -- 回顾 1.mysql 约束 1.非空 not null 2. 主键约束 primary key 3. 唯一约束 unique 4. 外键约束 foreign ...

  5. MySQL 视图触发器事务存储过程函数

    事务  致命三问 什么是事务:开启了一个包含多条SQL语句的事务,这些SQL语句要么都执行成功,要么有别想成功:例如A向B转账,二人账户并不属于一家银行,在转账过程中由于网络问题,导致A显示转账 成功 ...

  6. MySQL——视图/触发器/事务/存储过程/函数/流程控制

    一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...

  7. mysql视图、触发事务、存储过程

    视图 视图是一个虚拟表(非真实存在的),其本质就是根据SQL语言获取动态的数据集,并为其命名,用户使用时只需要使用名称即可获得结果集,可以将结果集当做表来使用. 视图是存在数据库中的,如果我们程序中使 ...

  8. python mysql 视图 触发器 事物 存储过程 用户授权 数据备份还原

    ###################总结########### 视图是一个虚拟表(非真实存在) 是跑在内存中的表,真实表是在硬盘上的表 使用视图我们可以把查询过程中的临时表摘出来,保存下来,用视图去 ...

  9. mysql视图 触发器 事物 函数 存储过程

    一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...

  10. Mysql学习---视图/触发器/存储过程/函数/执行计划/sql优化 180101

    视图 视图: 视图是一个虚拟表(非真实存在),动态获取数据,仅仅能做查询操作 本质:[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用.由 ...

随机推荐

  1. 使用 Suricata 进行入侵监控(一个简单小例子访问百度)

    前期博客 基于CentOS6.5下Suricata(一款高性能的网络IDS.IPS和网络安全监控引擎)的搭建(图文详解)(博主推荐) 1.自己编写一条规则,规则书写参考snort规则(suricata ...

  2. sdut1642Simple Arithmetics(模拟)

    链接 发个长长的模拟 这题要注意的地方挺多 -的个数 以及对齐的情况 全都注意好了 大数的加减乘就可以了 #include <iostream> #include<cstdio> ...

  3. dubbo系列--集群容错

    作为一个程序员,咱们在开发的时候不仅仅是完成某个功能,更要考虑其异常情况程序如何设计,比如说:dubbo的消费端调用服务方异常的情况,要不要处理?如何处理? dubbo提供了多种集群容错机制,默认是f ...

  4. dotnet cors 跨域问题

    研究了一整子的.net core框架,感觉挺好用的,可以用在实际项目中,前端avalon框架也在研究: 问题:跨域,相比原来的跨域解决方案,还是有不小的变化的,原来的.net api 只需要在WebA ...

  5. 微信轻松接入QQ客服

    一直以来,大家都苦恼怎么实现微信公众帐号可以接入客服,也因此很多第三方接口平台也开发客服系统CRM系统,不过不是操作复杂就是成本太高.今天分享一个低成本又简便的方法,让你的公众帐号接入QQ客服.下面介 ...

  6. 源代码管理git的使用

    Git ----本地仓库---- 1.新建一个“本地仓库” git init 2.配置仓库 ①告诉git你是谁 git config user.name syl ②告诉git怎么联系你 git con ...

  7. WebAPI中Area的使用

    很简单,创建area后,添加一下代码到AreaRegistration中即可 context.Routes.MapHttpRoute( name: "api_default", r ...

  8. 飞思卡尔开发板-迅为IMX6开兼容单核 双核 四核Plus开发板

    飞思卡尔开发硬件接口介绍: 核心板参数 尺寸:51mm*61mm CPU:Freescale Cortex-A9 四核 i.MX6Q,主频 1.2 GHz 内存:2GB DDR3 存储:16GB EM ...

  9. nutz配置druid监控

    druid 提供了一个web端的监控页面, 搭建起来不算麻烦, 建议添加. 打开web.xml, 在nutz的filter之前, 加入Web监控的配置 <filter> <filte ...

  10. QList模板类常用接口函数

    插入操作:insert()函数原型:void QList::insert(int i, const T &value) 在索引后插入值 i:索引 value:插入值 Example: QLis ...