事务,视图,索引,备份和恢复
1事务的四个属性,简称ACID属性
- 原子性:事务是一个完整的操作,事务的各部操作时不可分的(原子性的),要么都执行,要么不执行
- 一致性:当事务完成时,数据必须处于一致状态
- 隔离性:并发事务之间彼此隔离,独立,他不应该以任何方式依赖于或影响事务
- 持久性:事务完成之后,它对数据库的修改被永久保存
DELIMITER $$ CREATE PROCEDURE usp_transform() BEGIN ##1.设置全局错误总数 DECLARE t_error INTEGER DEFAULT 0; ##2.设置如果有SqlLexception 就将全局错误总数设置成1 DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1; ##3.关闭默认提交 SET autocommit=0; ##4.开始事务 START TRANSACTION; ##5.进行真实的业务操作 UPDATE bank SET money = money-1000 WHERE cid=1; UPDATE bank SET money = money+1000 WHERE cid=2; IF t_error>0 THEN ROLLBACK; ##4.回滚事务 ELSE COMMIT; ##5.提交事务 END IF; ##6.开启事务的默认提交 SET autocommit=1; END $$ DELIMITER; CALL usp_transform();
2.视图的用途
- 筛选表中的行
- 防止未经许可的用户访问铭感数据
- 降低数据库的复杂程度
- 将多个物理数据库抽象为一个逻辑数据库
##检查视图是否存在 存在删除 DROP VIEW IF EXISTS view_student_result; CREATE VIEW view_student_result AS SELECT stuName,stuno,studentresult,subjectname,examdate FROM student INNER JOIN result ON student.`stuno`=result.`Studentno` INNER JOIN `subject` ON result.`Studentno`=subject.`subjectid` WHERE `subject`.`subjectid`=( SELECT subjectid FROM `subject` WHERE subjectname='编程' )AND examdate =( SELECT MAX(examdate) FROM result,`subject` WHERE result.`subjectid`=subject.`subjectid` AND subjectname='编程' ) ##执行视图 SELECT * FROM view_student_result; ##删除视图 DROP VIEW IF EXISTS view_student_result USE `information_schema`; SELECT * FROM `grade``VIEWS`\G
2.1视图注意事项
- 视图中可以使用多个表
- 一个视图可以嵌套另一个视图
- 对视图数据进行添加、更新和删除操作直接影响所引用表中的数据
- 当视图数据来自多个表时,不允许添加和删除数据
3.索引
索引是一种有效组合数据的方式,为快速查找指定记录
作用:大大提高数据库的检索速度,改善数据库性能
##索引 CREATE INDEX INDEX_student_name ON student(stuname) SELECT * FROM student WHERE stuname='张允' ##删除索引 DROP INDEX INDEX_student_name ON
查看索引: show index from table_name
Table:创建索引的表
Non_unique:索引是否非唯一
Key_name:索引的名称
Column_name:定义索引的列字段
Seq_in_index:该列在索引中的位置
Null:该列是否能为空值
Index_type:索引类型
4.备份 :
数据库备份的必要性:
- 保证重要数据不丢失
- 数据转移
示例:
##数据备份 mysqldump -uroot -p `s2230myschool`>E:\s2230myschoolnewback-2018-06-13.sql
5.恢复:
方法一:直接使用最新的sql脚本覆盖现现有的数据就行
示例:
##恢复数据 mysql -uroot -p `myschoolbak`<E:\s2230myschoolnewback-2018-06-13.sql
6.向数据表插入批量数据
##插入批量数据 DELIMITER $$ DROP PROCEDURE IF EXISTS `myschool`.`autoInsert`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `autoInsert`() BEGIN DECLARE i INT DEFAULT 1; WHILE(i < 10000) DO INSERT INTO student(id, `name`) VALUES (DEFAULT, '123'); SET i = i+1; END WHILE; END$$ DELIMITER ; CALL autoInsert();
7.带参输入输出:
##带参输入输出 DELIMITER $$ CREATE PROCEDURE ups_getTotalStudentNumByGradeId(IN gid INT, tool INT) BEGIN SELECT * FROM student WHERE stuGradeid= gid; SET tool=FOUND_ROWS(); END$$ DELIMITER ; SET @num=0; CALL ups_getTotalStudentNumByGradeId(1,@num); SELECT @num