mysql的存储过程,函数,事件,权限,触发器,事务,锁,视图,导入导出
1.创建过程
1.1 简单创建
-- 创建员工表
DROP TABLE IF EXISTS employee;
CREATE TABLE employee(
id int auto_increment primary key,
`name` varchar(50),
depid int
); insert into employee(name,depid) values('vic',1),('myvic',2),('liu',2); -- 1.创建存储过程
DROP PROCEDURE IF EXISTS pro_employee;
DELIMITER //
CREATE PROCEDURE pro_employee(IN pdepid INT,OUT pcount INT)
BEGIN
SELECT COUNT(id) INTO pcount FROM employee WHERE depid=pdepid; #into是把值赋值给pcount
END
//
DELIMITER ;
#调用
call pro_employee(2,@pcount);
select @pcount;
-- 2. 返回最后的id值
DROP PROCEDURE IF EXISTS pro_insert;
DELIMITER //
CREATE PROCEDURE pro_insert(IN name varchar(50),IN depid INT,OUT id int)
BEGIN
insert into employee(name,depid) values(name,depid);
set id = last_insert_id(); # 获取最后的id值
END // DELIMITER ; -- 3 inout 模式,作为输入和输出
DELIMITER //
CREATE PROCEDURE p4(INOUT v_id INT)
BEGIN
# 定义变量
DECLARE v_count int;
IF v_id > 3 THEN
SET v_count = 100;
ELSE
SET v_count =500;
END IF;
# 返回值
SET v_id = v_count;
END //
delimiter ;
# 调用
set @id =1;
call p4(@id);
select @id; -- 4 变量
/**
DECLARE tax int DEFAULT 6; #存储过程变量
set @var =1; #会话变量;
二则的区别:
在调用存储过程时,以DECLARE声明的变量都会被初始化为 NULL。
而会话变量(即@开头的变量)则不会被再初始化,在一个会话内,
只须初始化一次,之后在会话内都是对上一次计算的结果,
就相当于在是这个会话内的全局变量。
*/ DELIMITER // CREATE procedure p3(in n int,OUT total int)
begin
DECLARE num int default 0; #变量必须声明后,才可以用
SET num = 100;
SET @a = 100; #如果没有declare,必须带上@,使用的时候也需要的
SET total = n +1+num+@a; END // DELIMITER ; -- 5 循环
DELIMITER //
CREATE PROCEDURE p5()
BEGIN
DECLARE i int;
set i = 1;
while i<5 do
insert into employee(name,depid) values(concat('vic',i),i);
set i=i+1;
end while;
END //
DELIMITER ;
1.2 存储过程的修改
一般不太支持;
2.函数
-- 1.函数的创建
DELIMITER //
CREATE FUNCTION getSum(num INT)
RETURNS INT # 返回值类型
BEGIN
SET num = num+1;
RETURN num;
END //
DELIMITER ; -- 2.函数的删除 DROP FUNCTION IF EXISTS func;
-- 3.查看所有的函数
show FUNCTION status;
3.事件
-- 1 创建事件
# 查看调度器
show variables like '%event_scheduler%';
# show variables 可以查看系统变量及值
# show status 系统运行的状态,不可更改;
#开启调度器
SET GLOBAL event_scheduler = ON;
SET GLOBAL event_scheduler = OFF;#关闭
#查看调度器线程
show processlist; # 测试表
DROP TABLE IF EXISTS events_list;
CREATE TABLE events_list(
id int auto_increment primary key,
event_name varchar(20) not null,
event_started timestamp not null
);
# 事件1 (立即启动事件)
CREATE EVENT IF not EXISTS event_now
ON SCHEDULE
AT now()
do insert into events_list(event_name,event_started) values('event_now',now()); # 事件2 (每分钟启动事件)
create event events_minute
ON schedule
every 1 minute
do insert into events_list(event_name,event_started) values('event_minute',now()); # 查询事件
show events;
select * from mysql.event; #查看所有事件 #修改时间
alter event event_minute
on schedule
every 30 second
do insert into events_list(event_name,event_started) value('event_second',now());
# 修改为不再次活动
alter event event_second disable;
alter event event_second enable; # 再次活动 # 删除事件
DROP EVENT IF EXISTS event_name;
4.权限
# 1 权限
# 1.1 创建用户
use mysql;
create user li@localhost IDENTIFIED BY 'li'; #identified by 会将纯文本加密作散列值存储 # 1.2 修改用户
rename user 'li'@'localhost' to 'newuser'@'localhost'; # 1.3 删除用户
DROP user 'li'@'localhost'; # 1.4 更改密码
set password for li@localhost = password('root'); # 1.5 查看用户权限
show grants for li@localhost; # grands usage 没有权限 # 1.6 赋予权限
grant select on text_db.* to 'li'@'localhost';
# 1.7 回收权限
revoke delete,select on *.* from 'li'@localhost; # 1.8 立即使用
flush privileges;
/*
1.9 user表中host的值的意义
% 匹配所有主机
localhost localhost不会被解析成IP地址,直接通过UNIXsocket连接
127.0.0.1 会通过TCP/IP协议连接,并且只能在本机访问;
::1 ::1就是兼容支持ipv6的,表示同ipv4的127.0.0.1
*/
# 1.10 grant 命令
grant all privileges on *.* to jack@'localhost' identified by 'jack' with grant option; /*
说明:
all privileges:所有权限,你也可以使用select,update等权限
on 权限针对那些库.表
*.* :前*号指定数据库名,后面*号指定表名
to :将权限赋予某个用户
jack@localhost : Jack表示用户,@后限制主机 %指向任何地方
iDentitied by :用户登录的密码
with grant option :将自己拥有的权限授权给别人,注意:经常有人在创建操作用户的时候不指定WITH GRANT OPTION选项导致后来该用户不能使用GRANT命令创建用户或者给其它用户授权。 备注:可以使用GRANT重复给用户添加权限,权限叠加,比如你先给用户添加一个select权限,然后又给用户添加一个insert权限,那么该用户就同时拥有了select和insert权限。 */ # 参考资料:https://www.cnblogs.com/fslnet/p/3143344.html
# https://www.cnblogs.com/Richardzhu/p/3318595.html
5.触发器
# 5.触发器
#5.1 创建触发器
# 另外有一个限制是不能同时在一个表上建立2个相同类型的触发器,
# 因此在一个表上最多建立6个触发器。
CREATE TABLE student_info(
stu_no int not null auto_increment primary key,
stu_name varchar(255)
)ENGINE=InnoDB auto_increment=1 default charset=utf8; CREATE TABLE student_count(
student_count int default 0
);
DELIMITER //
CREATE trigger trigger_name
after insert
on student_info for each row
BEGIN
update student_count SET student_count = student_count+1;
END //
DELIMITER ; CREATE trigger trigger_del
after delete
on student_info for each row
update student_count set student_count= student_count-1; insert into student_info(stu_name) values('vic3');
delete from student_info where stu_no=2; #5.2 查看触发器
show triggers [from schema_name]; # 5.3 删除触发器
DROP trigger [if EXISTS ] [schema_name] trigger_name; # 5.4 触发器执行顺序
/*
①如果 BEFORE 触发器执行失败,SQL 无法正确执行。
②SQL 执行失败时,AFTER 型触发器不会触发。
③AFTER 类型的触发器执行失败,SQL 会回滚。
*/ # 参考资料:https://www.cnblogs.com/CraryPrimitiveMan/p/4206942.html
6.事务处理
# 6 事务
/*
事务是一条或多条数据库操作语句的组合 具备acid 原子性:要不全部成功,要不全部撤销 隔离性:事务之间相互独立,互不干扰 一致性:数据库正确地改变状态后,数据库的一致性约束没有被破坏 持久性:事务的提交结果,将持久保存在数据库中 1.事务并发出现的问题
脏读,不可重复读(修改),更新丢失,幻读(新增或删除)
2.解决并发问题
(1)READ_UNCOMMITTED
这是事务最低的隔离级别,它充许另外一个事务可以看到这个事务未提交的数据。
解决第一类丢失更新的问题,但是会出现脏读、不可重复读、第二类丢失更新的问题,幻读 。
(2)READ_COMMITTED
保证一个事务修改的数据提交后才能被另外一个事务读取,即另外一个事务不能读取该事务未提交的数据。
解决第一类丢失更新和脏读的问题,但会出现不可重复读、第二类丢失更新的问题,幻读问题
(3)REPEATABLE_READ;默认级别
保证一个事务相同条件下前后两次获取的数据是一致的
解决第一类丢失更新,脏读、不可重复读、第二类丢失更新的问题,但会出幻读。
(4)SERIALIZABLE
事务被处理为顺序执行。
解决所有问题 */ # 6.2 使用
start transaction;
update t set number=2131 where id=2;
update t set number=3141 where id=3;
select count(*) from t;
commit;
rollback;
7.mysql 锁机制
# 7.mysql的锁机制
/*
1. 共享锁:读锁 不好阻塞其他读操作,会阻塞其他用户写操作
2. 排它锁:写锁 阻塞其他用户的读写操作
MyISM默认的锁调度机制是写优先
*/
lock tables order read local, order_detail read local;
select sum(total) from orders;
select sum(subtotal) from order_detail;
unlock tables;
# 7.2 整理空间碎片
optimize table t_name;#myisam下,innodb需要独享表空间
show variables like 'innodb_file_per_table';#off不是独享表空间
analyze table t_name;#innodb 优化表 # 7.3 InnoDB锁机制
show status like 'innodb_row_lock%';#查看锁状态
set autocommit=0;
lock tables t1 write,t2 read;
[]
commit;
unlock tables;
# 参考资料:https://www.cnblogs.com/chenqionghe/p/4845693.html
8.视图
# 8 视图
# 8.1 创建视图
DROP view IF EXISTS v1;
CREATE ALGORITHM = UNDEFINED
DEFINER=`root`@`localhost`
SQL SECURITY DEFINER
view v2 as select id,number from t;
/*
几点说明(MySQL中的视图在标准SQL的基础之上做了扩展): ALGORITHM=UNDEFINED:指定视图的处理算法; DEFINER=`root`@`localhost`:指定视图创建者; SQL SECURITY DEFINER:指定视图查询数据时的安全验证方式;
*/
# 8.2 视图修改
update v1 set number=1 where id=1;
# 注意:不能在一张由多张关联表连接而成的视图上做同时修改两张表的操作
#8.3 增加
insert into v1(number) values(2000);
-- 注意:表中的其他字段,要允许为空,否则操作失败
# 8.4 删除
delete from v1 where id=8; # 8.5 删除视图
DROP view IF EXISTS v1;
9.mysql的导出和导入
# 9.数据导入导出
# 9.1 第一种方法
mysql -hlocalhost -uroot -proot input_out < E:\phpwebenv\PHPTutorial\WWW\test\dump.sql --default-character-set=utf8
# 第二种方法
use input_out;
source E:\phpwebenv\PHPTutorial\WWW\test\input.sql; # 9.2 导出数据
mysqldump -hlocalhost -uroot -proot test_db > E:\phpwebenv\PHPTutorial\WWW\test\dump.sql --default-character-set=utf8
# 9.3 备份和还原
mysqldump -uroot -proot input_out t > E:\phpwebenv\PHPTutorial\WWW\test\back.sql
mysqldump -uroot -proot --databases input_out test_db > backup.sql # 备份多个数据库 mysql -uroot -proot < E:\phpwebenv\PHPTutorial\WWW\test\backup.sql
导出mysqldump详细介绍:
mysqldump -uroot -proot --databases db1 --tables a1 a2 >/tmp/db1.sql -- 按照where条件
mysqldump -uroot -proot --databases db1 --tables a1 --where='id=1' >/tmp/a1.sql -- 只导表结构
mysqldump -uroot -proot --no-data --databases db1 >/tmp/db1.sql
sql 语句导出excel 文件
mysql> show variables like '%secure%';
+--------------------------+-----------------------+
| Variable_name | Value |
+--------------------------+-----------------------+
| require_secure_transport | OFF |
| secure_auth | ON |
| secure_file_priv | /var/lib/mysql-files/ | select * into outfile "/var/lib/mysql-files/reports.xls" from mv_reprots;
如果导出表中的部分数据如何处理;
mysql -uroot -p mv -e "select id,name from system into outfile '/var/lib/mysql-files/my_name.sql'"
报错:
ERROR 1290 (HY000) at line 1: The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
解决:
show variables like '%secure%';
+------------------+-----------------------+
| Variable_name | Value |
+------------------+-----------------------+
| secure_auth | ON |
| secure_file_priv | /var/lib/mysql-files/ |
+------------------+-----------------------+
2 rows in set (0.00 sec)
导出的文件必须放到这个目录项目,
数据:
# 导出excel文件
mysql> select * from refer into outfile '/var/lib/mysql-files/refer.xls'\G
参考资料:https://www.cnblogs.com/chenmh/p/5300370.html
mysql的存储过程,函数,事件,权限,触发器,事务,锁,视图,导入导出的更多相关文章
- MySQL mysqldump 导入/导出 结构&数据&存储过程&函数&事件&触发器
———————————————-库操作———————————————-1.①导出一个库结构 mysqldump -d dbname -u root -p > xxx.sql ②导出多个库结构 m ...
- MySQL 存储过程 函数 routine 权限
MySQL 存储过程 函数 routine 权限 Table of Contents 1. mysql存储过程/函数权限 1.1. 相关对象操作权限检查 1.2. 执行权限 1 mysql存储过程/函 ...
- MySQL存储过程中的3种循环,存储过程的基本语法,ORACLE与MYSQL的存储过程/函数的使用区别,退出存储过程方法
在MySQL存储过程的语句中有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环.还有一种非标准的循环方式:GOTO,不过这种循环方式最好别用,很容易引起程序的混乱,在这里就不错具体 ...
- MySQL创建存储过程/函数需要的权限
alter routine---修改与删除存储过程/函数 create routine--创建存储过程/函数 execute--调用存储过程/函数 下面有一篇介绍MySQL所有权限的博文 http:/ ...
- MySQL进阶19--函数的创建(举例)/设置mysql的创建函数的权限/查看(show)/删除(drop) / 举4个栗子
/*MySQL进阶19 函数 存储过程和函数:都类似于java中的方法; 存储过程和函数通用好处: 1.提高代码的重用性 2.简化操作 好处: 减少操作次数,减少了编译次数,减少了和服务器的连接次数, ...
- mysql使用存储过程&函数实现批量插入
写这边文章的目的,是想结合mysql 存储过程+函数完成一个批量删除的功能吧...正好也好加深下对procedure和function的熟练操作吧...废话不多说,我就直接上表结构啦哈,如下: cre ...
- mysql查看存储过程函数
查询数据库中的存储过程和函数 select `name` from mysql.proc where db = 'xx' and `type` = 'PROCEDURE' //存储过程 ...
- rds - mysql修改存储过程/函数的方式
rds 不支持账户A 给账户B 创建授权存储过程,只能是当前登录账户给自己创建,要登陆对应账户删除原有存储过程重新创建即为修改. 例子如下: 先登陆新账号然后执行如下sql语句即可: DROP PRO ...
- Mysql数据库远程链接、权限修改、导入导出等基本操作
一.连接MySQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -ur ...
- MySQL通过自定义函数实现递归查询父级ID或者子级ID
背 景: 在MySQL中如果是有限的层次,比如我们事先如果可以确定这个树的最大深度, 那么所有节点为根的树的深度均不会超过树的最大深度,则我们可以直接通过left join来实现. 但很多时候我们是无 ...
随机推荐
- Linux之shell编程
一.Bash变量 1) Bash变量与变量分类 1. 定义:变量是计算机内存的单元,其中存放的值可以改变 2. 变量命令规则 #变量名必须以字母或下划线开头,名字中间只能由字母.数字和下划线组成 #变 ...
- VMware下载安装及CentOS7下载安装
我是在Windows10系统下,下载的VMware Workstation 12 1.下载虚拟机软件 安装包位置(里面有激活码):https://pan.baidu.com/s/1i5hn5lj 2. ...
- 凯撒密码加密解密--JAVA实现(基础)
凯撒密码一种代换密码,据说凯撒是率先使用加密函的古代将领之一,因此这种加密方法被称为恺撒密码.凯撒密码的基本思想是:通过把字母移动一定的位数来实现加密和解密.明文中的所有字母都在字母表上向后(或向前) ...
- Readis For Windows安装及密码、IP限制
一.下载与安装Readis Github下载地址:https://github.com/MicrosoftArchive/redis/tags 下载.MSI后下一步安装即可 二.验证安装 1. 在&q ...
- ES6常用知识点小结
ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准. 因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015(简称ES2015).虽然浏览器在不 ...
- 【HAOI2015】树上操作(树链剖分)
题面 Description 有一棵点数为N的树,以点1为根,且树点有边权.然后有M个操作,分为三种: 操作1:把某个节点x的点权增加a. 操作2:把某个节点x为根的子树中所有点的点权都增加a. 操作 ...
- 8Manage:聚焦研发企业利器——研发项目管理
[导读]研发是企业保持核心竞争力的基石.那么对于研发企业来说,如何计划研发项目目标.保障项目的稳定运行,如何分配人才.资源,把控项目成本呢?这些一系列问题摆在管理者面前!引入8Manage研发项目管理 ...
- vsto下开发wps插件
我们要开发wps插件了.之前用vsto开发过word插件,我也讲过c#下如何开发wps插件(有点繁琐).如果采用c#从头再开发wps插件,那么开发出来的office加载项就会出现两个.我们要实现的wp ...
- C# Redis实战(二)
二.Redis服务 在C# Redis实战(一)中我将所有文件拷贝到了D盘redis文件夹下,其中redis-server.exe即为其服务端程序,双击即开始运行,如图 可以 ...
- netcore 使用surging框架发布到docker
demo运行在windows的docker中,系统是win10,所以需要先下载Docker for Windows,安装完毕后系统会重启,然后桌面上可以找到Docker for Windows的快捷图 ...