视图
一、介绍
SQL语句的执行结果是一张虚拟表,我们可以基于该表做其他操作
如果这张虚拟表需要频繁使用,为了方便,可以将虚拟表保存起来,宝尊之后就称之为“视图”(本质就是一张虚拟表)
二、代码演示
create view 视图名 as SQL语句;
create view teacher_course as select * from teacher
inner join
course on course.teacher_id = teacher.tid;
三、注意事项
1.在硬盘中,视图只有表结构文件,没有表数据文件
视图可以当做表来操作,但是视图只会展示数据
2.视图通常是用于查询,尽量不要修改视图中的数据
视图也不能修改数据
3.视图容易和表造成混淆
分不清是表还是视图,在操作时容易有不必要的麻烦,而且视图会占用硬盘空间,但是Navicat里有作区分
总结
视图能尽量少用就尽量少用
触发器
一、介绍
针对表数据的增、删、改自动触发的功能(增前、增后、删前、删后、改前、改后)
二、语法结构
create trigger 触发器的名字 before/after inster/update/delete on 表名 for each row
begin
SQL语句
end
三、注意事项
触发器内部的SQL语句需要用到分号,但是分号又是SQL语句默认的字符
所以为了能够完整的写出触发器的代码,需要临时修改SQL语句的默认结束符
delimiter $$ # 把结束符改成>>> $$
编写需要用到分号的各种语句
delimiter ; # 把结束符改回>>> ;
四、代码演示
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代表执行失败
);
CREATE TABLE errlog(
id INT PRIMARY KEY auto_increment,
err_cmd char(64),
err_time datetime
);
delimiter $$ # 将mysql默认的结束符由;换成$$
create trigger tri_after_insert_cmd after insert on cmd for each row
begin
if NEW.success = 'no' then # 新记录都会被MySQL封装成NEW对象
insert into errlog(err_cmd,err_time) values(NEW.cmd,NEW.sub_time);
end if;
end $$
delimiter ; # 结束之后记得再改回来,不然后面结束符就都是$$了
#往表cmd中插入记录,触发触发器,根据IF的条件决定是否插入错误日志
INSERT INTO cmd (
USER,
priv,
cmd,
sub_time,
success
)
VALUES
('kevin','0755','ls -l /etc',NOW(),'yes'),
('kevin','0755','cat /etc/passwd',NOW(),'no'),
('kevin','0755','useradd xxx',NOW(),'no'),
('kevin','0755','ps aux',NOW(),'yes');
# 查询errlog表记录
select * from errlog;
# 删除触发器
drop trigger tri_after_insert_cmd;
事务
一、事务的四大特征(ACID)
A:原子性
事务是一个完整的操作,事务的各个步骤有一个不完成,就所有步骤全都不会完成
C:一致性
当事务完成时,数据必须处于一致状态
I:隔离性
对数据进行修改的所有并发事务是彼此隔离的。表明事务必须是独立的,他不应以任何方式依赖于或影响其他事物。
D:持久性
不管系统是否发生故障,事务处理的结果都是永久的
二、扩展重要知识
1.MySQL提供两种事务型存储引擎InnoDB和NDB cluster及第三方XtraDB、PBXT
2.事务处理中会反复出现的关键词
事务:transaction
回退:rollback
提交:commit
保留点:savepoint
作用:
为了支持回退部分事务处理,必须在事务处理块中合适的位置放置占位符,如果需要回退,可以回退到某个占位符(保留点)
# 保留点在执行rollback或者commit之后自动释放
创建占位符:savepoint
savepoint sp01;
回退到占位符地址:
rollback to sp01;
三、四种隔离级别
1.read uncommitted(未提交读)
事务中的SQL语句修改了数据,即使没有事务提交,其他事务也可以读取到未提交时修改后的数据。 —— 脏读现象
2.read committed(提交读=不可重复读)
大多数数据库系统的默认隔离级别
事务A在修改数据时,如果事务A没有提交事务,其他事务不会看到被修改后的数据,也就避免了脏读
但是有可能两个事物同时修改同一表格的数据,底层上会出现问题
3.repeatable read(可重复读)
在一个事务内,最开始读到的数据和事务结束前任意某时刻读到的数据出现不一致,出现幻读现象。
幻读:事务A读取数据,事务B修改添加了新的记录并提交,事务A再次读取数据,会出现幻行。
4.serializable(可串行读)
强制事务串行执行,很少使用该级别。
四、事务日志
1.优点
可以帮助提高事务的效率
存储引擎在修改标的大数据的时候,只需要修改其内存拷贝再把该修改记录到存储在硬盘上的事务日志中,而不用每次都将修改的数据本身存储到磁盘
MVCC多版本并发控制
一、特点
MVCC只能在 read committed(提交读)、repeatable read(可重复读)两种隔离级别下工作,其他两个不兼容(read uncommitted:总是读取最新 serializable:所有的行都加锁)
InnoDB的MVCC通过在每行记录后面保存两个隐藏的列来实现MVCC
一个列保存了行的创建时间
一个列保存了行的过期时间(或删除时间)本质是系统版本号
一个列保存了行的过期时间(或删除时间)本质是系统版本号
每开始一个新的事物版本号都会自动递增,事物开始时刻的系统版本号会作为事物的版本号用来和查询到的每行记录版本号进行比较
例如:刚插入第一条 数据的时候,我们默认事物id为1,实际是这样存储的
username | create_version | delete_version |
---|---|---|
jason | 1 |
可以看到我们在content
列插入了kobe这条数据,在create_version这列存储了1,1是这次插入操作的事物id
然后我们呢将jason修改为jason01,实际存储是这样的
username | create_version | delete_version |
---|---|---|
jason | 1 | 2 |
jason01 | 2 |
可以看到,update的时候,会先将之前的数据delete_version 标记为当前新的事物id,也就是2,然后将新数据写入,将新数据的create_version标记为新的事物id
当我们删除数据的时候,实际存储是这样的
username | create_version | delete_version |
---|---|---|
username | create_version | delete_version |
jasion01 | 2 | 3 |
由此当我们查询一条记录的时候,只有满足以下两个条件的记录才会被显示出来:
- 当事物id要大于或等于当前的create_version 值,这表示在事物开始签这行数据已经存在了。
- 当前事务id要小于delete_version 值,这表示在事务开始之后这行记录才被删除。
二、存储过程
1.类似于python中的自定义函数
语法格式
delmiter 临时结束符
create procedure 名字(参数,参数)
begin
sql语句;
end 临时结束符
delimiter ;
delimiter $$ #临时修改 结束符
create procedure p1(
in m int, in # in表示这个参数必须只能传入不能返回出去
in n int, in
out res int # out表示这个参数可以被返回出去,还有一个inot 表示即可传入也可以被返回出去
)
begin
select tanme from teacher where tid > m and tid < n;
set res=0; # 用来标志存储过程是否执行
end $$
delimiter ; #改回结束符
#针对 res 需要先提前定义
set @res=10; 定义
select @res; 查看
call p1(1.5,@res) 调用
select @res 查看
查看存储过程具体信息
show create procedure pro1;
查看你所有存储过程
show procedure status;
删除存储过程
drop procedure pro1;
三、内置函数
可以通过 help
函数名 查看帮助信息
移除指定字符
select Trim() # 默认移除两边空额
select LTrim
标签:触发器,create,cmd,事务,视图,修改,version
From: https://www.cnblogs.com/Zhang614/p/16610350.html