接上回MySQL基础篇
数据完整性约束
定义完整性约束
实体完整性
主键约束
(1)作为列的完整性约束

(2)作为表的完整性约束

2.候选键约束
将id字段和user字段设置为候选键

参照完整性
将classid字段设置为外键

用户定义完整性
非空约束
将name字段添加非空约束

CHECK约束
列约束,限制age字段的值

表约束,限制classid字段

命名完整约束
添加命名外键完整约束


更新完整性约束
删除完整性约束
删除fk-classid

修改完整性约束
更新fk-classid的外键约束为级联删除和级联更新

存储过程与存储函数
创建存储过程和存储函数
创建存储过程
创建一个存储过程

创建存储函数
创建存储函数

变量的应用
局部变量

全局变量

为变量赋值
declare var_name[...] type [default value]
set var_name=expr[,var_name=expr]..
光标应用
声明光标
declare cursor_name cursor for select_statement
打开光标
open info_of_student
使用光标
fetch info_of_student into tmp_name,temp_tel;
关闭光标
close info_of_student
调用存储过程和存储函数
调用从存储过程

调用存储函数

查看存储过程和存储函数
SHOW STATUS语句
显示所有db_database14的存储过程
show procedure status where db='db_database14';
SHOW CREATE语句

修改存储过程和存储函数

删除存储过程和存储函数

触发器
MySQL触发器
创建MySQL触发器



创建具有多条执行语句的触发器
模拟一个删除日志数据表和一个删除时间表




查看触发器
SHOW TRIGGERS语句

查看triggers表中触发器信息
select * from information_schema.triggers;
使用触发器
触发器的执行顺序


使用触发器维护冗余数据
使用触发器维护库存数量




删除触发器

事务
事务机制
事务的概念
原子性,一致性,隔离性,持久性
事务机制的必要性
实现从借记卡账户A向B转账700元,成功后再从A向B转账500元





关闭MySQL自动提交


事务回滚
实现A向B转账500,出错时进行事务回滚



事务提交
显示提交
commit
隐式提交
set autocommit=1
MySQL中的事务
在存储过程中创建事务



回退点
创建一个事务,当出现错误时,回滚到提前定义的回退点


锁机制
锁机制的基本知识
1.锁的类型
读锁(共享锁)
写锁(排他锁)
2.锁粒度
3.锁策略
(1)表级锁
(2)行级锁
4.锁的生命周期
MySAM表的表级锁
以读方式锁定数据表
以读方式锁定数据库中用户的数据表





以写方式锁定数据表

在新的窗口查询则显示失败,关闭后则显示成功

InnoDB表的行级锁


窗口二

事件
事件概述
查看事件是否开启

开启事件
1.设置全局参数
set clobal event_scheduler=ON;

更改配置文件
event_scheduler=on
创建事件
创建一个事件,用于每隔5秒向数据表tb_eventtest中插入一条数据



修改事件
修改事件,让其每隔30秒向数据表插入数据


删除事件

备份与恢复
数据备份
使用mysqldump命令备份
备份一个数据库
mysqldump -u root -p test student >E:\ student.sql
备份多个数据库
mysqldump -u root -p --database test mysql >E:\backup.sql
备份所有数据库
mysqldump -u root -p --all -database >E:\all.sql
直接复制整个数据库目录
show variables like '%datadir%';
数据恢复
使用mysql命令还原
mysql -u root -p <E:\all.sql
数据库迁移
mysqldump -h name1 -u root -password=password1 --all-databases |
mysql -h host2 -u root -password=password2
表的导出和导入
用select...into outfile 语句导出文本文件

实现导出信息表记录
select*from tb_bookinfo into outfile 'D:/bookinfo.txt'
-> fields terminated by '\,' optionally enclosed by '\"'
-> lines starting by '\>' terminated by '\r\n';
用mysqldump命令导出文本文件
mysqldump -u root -p -T "D:\" db_database18 tb_library "--lines-terminated-by=\r\n"
"--fields_terminated_by=," "--fields_optionally_enclosed-by="";
用mysql命令导出文本文件
mysql -u root -p --html -e "select*from tb_bookinfo" db_database18>E:\bookinfo.html
用load data infile命令将文本文件导入数据表
将文本文件中的数据导入表中
load data infile 'E:\bookinfo.txt' into table tb_bookinfo
fields terminated by '\t'
lines terminated by '\r\n'
ignore 1 lines;
用mysqlimport命令导入文本文件
mysqlimport -u root -p db_database18 "E:\tb_bookinfo.txt"
"--lines-terminated-by=\r\n" "--fields-terminated-by=\t" "--fields-optionally-enclosed-by=\"
MySQL性能优化
分析MySQL数据库的性能
connections:服务器连接次数
uptime:服务器上线时间
slow_queries:慢查询次数
com_select:查询操作次数
con_insert:插入操作的次数
com_delete:删除操作次数
查看服务器的连接和查询次数

通过profile工具分析语句消耗性能



优化查询
分析查询语句


索引对查询速度的影响


使用索引查询
应用关键字like优化索引查询


查询语句中使用多列索引
create index index_book_info on tb_bookinfo(bookname,price);
查询语句中使用关键字or
select*from tb_bookinfo where bookname='MySQL从入门到精通' or price=89;

优化数据库结构
将字段很多的表分解成多个表
desc tb_student_extra;
增加中间表


insert into temp_student select s.id,s.name,c.name
-> from tb__student s,tb_class1 c where s.classid=c.id;
优化插入记录的速度
禁用索引
alter table 表名 disable keys;
禁用唯一性检查
set unique_checks=0;
set unique_checks=1;
优化insert语句
insert into tn_food values
(null,'果冻','CC果冻',1.8,'2011','北京'),
...;
分析表、检查表和优化表
分析表

检查表
check table 表名1[,表名2...];
优化表
optimize table 表名1[,表名2...];
优化多表查询
优化学生姓名和班级名称
SELECT s.name FROM tb_student s,tb_classes c WHERE s.classid=c.id AND c.name='一年三班';
SELECT name FROM tb_student WHERE class_id=(SELECT id FROM tb_classes c WHERE name='一年三班');
权限管理及安全控制
用户和权限管理
使用CREATE USER命令创建用户

使用DROP USER命令删除用户
drop user mrsoft
使用RENAME USER命令重命名用户

使用GRANT和REVOKE命令管理访问权限
查看用户权限

设置用户权限
grant all on *.* to 'super'@'localhost'with grant option
注:本章源代码来自《MySQL从入门到精通》












![前沿重器[39] | 对话式推荐系统——概念和技术点](https://img-blog.csdnimg.cn/img_convert/f636159cc14c18be2d486e705be68835.png)






