MySQL触发器 ,视图索引 , 事务

MySQL进阶二

补充触发器知识

# 删除触发器代码
drop trigger 触发器名;


# 当一个学员发生转班,班级对应的总数进行同步变化

# 当一个学员发生转班,班级对应的总数进行同步变化

delimiter !!

create trigger movestudent after update on stu1 for each ROW

BEGIN
	#定义两个变量
	declare numOld int; # 定义旧班级人数
	declare numNew int; # 定义新班级人数

	set numOld = (select stu_num from stu2 where class = old.class);
	select  numOld into @a;
	
	set numNew = (select stu_num from stu2 where class = new.class);
	select numNew into @b;


	update stu2 set stu_num = numOld - 1 where class = old.class;
	update stu2 set stu_num = numNew + 1 where class = new.class;

end !!
delimiter;

update stu1 set class = 2302 where name = "阿涛";

select @a;
select @b;

drop trigger movestudent;

1、视图

视图: 是一个虚拟表,内容就是由查询结果定义
视图不是真实的数据,只是一个数据映射
但是视图的结构和真正的表结构是一样


视图作用:
简化高频或者复杂的查询语句
高并发: 数据库也会有并发压力
商品展示查询就要用到视图表
而且还可以起到一个权限

视图表只能查询操作

# 创建视图表
create view 视图名称 as select 已查询语句;

# 查询当前数据库所有的视图
create view stu_2301 as 
select * from stu1 where class = 2301;

# 删除视图表
drop view 视图名称;


# 查询当前数据库所有视图
# 格式
show full tables in 数据库名称 where table_type like "view";

show full tables in demo924 where table_type like "view";

2、索引

索引:index 就是目录

一般如果你的表查询很多,一般可以用索引进行查询

目的:优化我们的查询速度

1.主键索引  (primary key)
2.普通索引
3.唯一索引

# 在创建表到时候就要创建索引
# 格式
create table 表名(
	字段名 数据类型,
    字段名 数据类型,
	
    # 普通索引
    index 索引名称(字段名),
    # 唯一索引
    unique 索引名称(字段名)

);

# 以后五次格式报错同学,罚抄10遍格式样式

# 能创建表后插入索引

create index 索引名称 on 表名(字段名);
create unique 索引名称 on 表名(字段名);


# ---------------------------
create table t12(
	name char(5),
	index  name_index(name)

);

insert into t12 values 
("守护"),
("秃头"),
("11166", );


# 查询索引
select * from t12 where name = "秃头";

3、存储引擎

其实储存引擎就是mysql如何储存这个数据的

InnoDB 流行储存引擎
SHOW ENGINES;

6、事务(重点)

it 必须学习

事务处理 : 是用来维护数据库的完整性,保证sql语句要么就全部执行,要么全部不执行

事务处理: select,insert, update, delete 语句

事务一旦提交,就不会发生丢失的现象
事务要满足四个条件:原子性, 一致性, 隔离性, 持久性

原子性:一组事务, 所有sql语句要么就全部进行成功,要全部不执行, 之前执行的全部执行回滚

一致性:事务b撤回的数据应该来自事务A,总共两者的总数是一致的


隔离性:各自的事务都是独立运行,一个事务处理后的结果如果影响到其他事务的时候, 其他事务需要先撤回


持久性:事务的持久性(也就永久性)是指一旦事务提交成功了,对数据修久性。



事务隔离级别:
1.读取未提交

事务A和事务B, 事务A没有提交数据,事务B读取到,但是不是持久性的,可以回滚的,这里事务b读取的数据叫"脏数据"。



2.读取已提交
事务A和事务B 事务A要提交后数据,事务B才能读取到
一句话就是我们读取的数据都是数据库真实数据
但是这个隔离导致不可重复读取

就是同一个事务,只能读取一次

这种不会用

3.可重复读取
事务A 和 事务B , 事务A提交的数据,事务b可以重复读取
这种隔离是sql默认隔离级别

4.串行化
事务A和事务B,事务A操作数据库的是,事务b只能排队等待
这种隔离级别很少使用,吞吐量太低,用户体验差


/*
事务还可以分两个大类: 隐性事务和显性事务

隐性事务很简单: 就是insert ,delete, update 都是隐性事务。都是默认提交

显性事务: 可以看出事务过程的,有明显的开始与结束标志,


	

*/

# 开始显性事务
begin;

insert into t12 values("放屁蹦出诗");

commit;

select * from t12;



# 开始显性事务
begin;

insert into t12 values("放屁蹦出诗");


select * from t12;

rollback;

commit;

7、pymysql(重点)

使用python 执行mysql的sql语句进行增删改查


pip install pymysql
import pymysql

# 开始建立数据库对象
db = pymysql.connect(
    # host 地址,我们主机地址localhost,或者IP地址127.0.0.1
    host="localhost",
    # 数据库用户名
    user="root",
    # 密码
    password="root",
    # 数据库字符编码
    charset="utf8",
    # 你要用的数据库名称
    database="demo924"

)

# 创建游标对象(理解为指针),代表该链接的数据库
# cursor专门创建游标
cur = db.cursor()

# 这里不需要分号,sql语句不区分大写
sql = "DeSc stu1"

# 需要执行sql语句
cur.execute(sql)

# 查询返回结果fetchall(), fetchone(), fetchany()
# 返回一个嵌套元组
print(cur.fetchall())



# 如何设置显性事务
# 插入多个数据

sql = "insert into stu1(name,class,sex) values (%s, %s ,%s) "

values = [
    ("xxx6", '2301', "女"),
    ("xxx7", '2303', "女"),
    ("xxx8", '2302', "男")

]


# 使用多条数据进行结合方法executemany(sql语句, 数据)
cur.executemany(sql, values)

db.commit()





  • 11
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攒了一袋星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值