分享

终于有人将MySQL讲明白了

 piyanat 2020-05-08

前言导读

在日常开发中,存储数据的最常用的方式便是数据库了,其中最为著名的便是

MySQL数据库,因他简便易于上手而且可扩展性强大,跨平台使得它广为使用,今天我们就来具体聊聊。

1.安装

2.数据类型

3.库 表常见操作

4.索引

5.视图

6.函数

7.游标

8.触发器

9.存储过程

10.事务

11.备份与还原

12.用户账号

13.其他

一、安装过程

我们所使用的是MySQL 5.7版本,这个版本算是挺不错的。下面我们来介绍下这个版本的具体安装过程吧。

1.解压安装

因为官网目前下载不了,为了大家安装过程中方便,我们下载一个免安装版mysql,

地址:
https:///file/7715018-442009503,下载好后将这个压缩包文件解压到指定的磁盘下,比如我想解压到E盘的mysql文件夹中。如图:

终于有人将MySQL讲明白了
  1. 配置环境变量

为了让mysql 可以在任意目录运行,我们可以将mysql的bin目录添加到环境变量,如图:

终于有人将MySQL讲明白了

3.修改配置文件

在mysql目录下创建一个my.ini配置文件,修改配置:

[mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] #设置3306端口 port = 3306 # 设置mysql的安装目录 basedir='E:\mysql\mysql-5.7.11-winx64' # 设置mysql数据库的数据的存放目录 datadir='E:\mysql\mysql-5.7.11-winx64\data' # 允许最大连接数 max_connections=200 # 服务端使用的字符集默认为8比特编码的latin1字符集 character-set-server=utf8 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB

4.安装mysql

以管理员身份运行命令提示符,输入mysqld install命令(注意是mysqld而不是mysql)回车,即可安装MySQL,提示:Service successfully installed,则表示安装成功,如下图所示:

终于有人将MySQL讲明白了

移除服务:mysqld remove

5.启动mysql服务

在命令提示符下执行命令,

启动mysql:net start mysql

停止:net stop mysql

发现启动不了,如图:

终于有人将MySQL讲明白了

这是怎么回事了,哦~原来是因为还没有初始化,那么我们现在来进行初始化,

执行指令:mysqld --initialize-insecure --user=mysql,

mysqld --initialize-insecure:自动生成无密码的root用户,

mysqld --initialize:自动生成带随机密码的root用户,

mysqld --initialize --user=mysql --console:生成随机密码并显示在控制台窗口,

data文件夹不为空是不能执行这个命令的(删掉data文件即可),

执行mysqld --initialize-insecure --user=mysql命令会自动新建data文件夹。执行结果如图:

终于有人将MySQL讲明白了

可以看到执行成功了,再次启动mysql服务,启动成功。如图:

终于有人将MySQL讲明白了

6.进入mysql,修改登陆密码确保安全

第一次进入mysql 是没有密码就可以登陆了,我们可以设置登陆密码,

更改root密码,输入:

update mysql.user set password=password('123321') where user = 'root';

因为新版mysql数据库下没有password字段,所以需要使用如下命令:

update mysql.user set authentication_string=password('123321') where user='root';
刷新权限:flush privileges;

这是必须的,不然操作没有效果。

也可以这样修改密码:

set password = password('123456');

这样就将root用户的密码设置为了 123456了,下面我们退出mysql再重新进去,顺带说下退出命令:

退出mysql:quit;

接下来在进入mysql,如图:

终于有人将MySQL讲明白了

这样root用户就有了密码,他的密码就是123321.

整个安装过程就完成了,是不是很简单了。

另外,为了提高交互效果,我们还可以一个软件-------sqlyong,他可以和mysql建立链接,

下载地址:
https:///file/7715018-442029096,

然后输入压缩包内自带的注册码破解就可以免费使用了。

终于有人将MySQL讲明白了
终于有人将MySQL讲明白了

2.mysql 数据类型

1.数值类型

MySQL支持所有标准SQL数值数据类型。

这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。

关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。

BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。

作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。

类型 大小 范围(有符号) 范围(无符号) 用途 TINYINT 1 字节 (-128,127) (0,255) 小整数值 SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值 MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值 INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值 BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值 FLOAT 4 字节 (-3.402 823 466 E 38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E 38) 0,(1.175 494 351 E-38,3.402 823 466 E 38) 单精度 浮点数值 DOUBLE 8 字节 (-1.797 693 134 862 315 7 E 308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E 308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E 308) 双精度 浮点数值 DECIMAL 对DECIMAL(M,D) ,如果M>D,为M 2否则为D 2 依赖于M和D的值 依赖于M和D的值 小数值

2.日期和时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

每个时间类型有一个有效值范围和一个'零'值,当指定不合法的MySQL不能表示的值时使用'零'值。

TIMESTAMP类型有专有的自动更新特性,将在后面描述。

类型 大小 (*字节)** 范围 格式 用途 DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值 TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间 YEAR 1 1901/2155 YYYY 年份值 DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值 TIMESTAMP 4 1970-01-01 00:00:00/2037 年某时 YYYYMMDD HHMMSS 混合日期和时间值,时间戳

3.字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

类型 大小 用途 CHAR 0-255字节 定长字符串 VARCHAR 0-65535 字节 变长字符串 TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串 TINYTEXT 0-255字节 短文本字符串 BLOB 0-65 535字节 二进制形式的长文本数据 TEXT 0-65 535字节 长文本数据 MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据 MEDIUMTEXT 0-16 777 215字节 中等长度文本数据 LONGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据 LONGTEXT 0-4 294 967 295字节 极大文本数据

CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

BINARY和VARBINARY类类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。

BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。

有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求。

Enum('fds','fsa','fasf') :枚举类型

set(val1,val2,val3):集合类型

3.库表操作

1、MySQL触发器的创建语法: CREATE[DEFINER = { 'user' | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW [trigger_order] trigger_body 2、MySQL创建语法中的关键词解释: 字段                     含义                                               可能的值 DEFINER=           可选参数,指定创建者,                               DEFINER='root@%'             默认为当前登录用户(CURRENT_USER);             该触发器将以此参数指定的用户执行,                       DEFINER=CURRENT_USER                 所以需要考虑权限问题; ​ trigger_name   触发器名称,最好由表名 触发事件关键词 触发时间关键词组成;   trigger_time     触发时间,在某个事件之前还是之后;                   BEFOREAFTER ​   INSERT:插入操作触发器,INSERTLOAD DATAREPLACE时触发;   UPDATE:更新操作触发器,UPDATE操作时触发; trigger_event 触发事件,如插入时触发、删除时触发;           DELETE:删除操作触发器,DELETEREPLACE操作时触发;   INSERTUPDATEDELETE table_name          触发操作时间的表名;   可选参数,如果定义了多个具有相同触发事件和触法时间的触发器时( 如:BEFORE UPDATE),默认触发顺序与触发器的创建顺序一致,可以 trigger_order 使用此参数来改变它们触发顺序。mysql 5.7.2起开始支持此参数。 FOLLOWS:当前创建触发器在现有触发器之后激活;                 FOLLOWSPRECEDES PRECEDES:当前创建触发器在现有触发器之前激活; trigger_body     触发执行的SQL语句内容,一般以begin开头,end结尾            BEGIN .. END 触发执行语句内容(trigger_body)中的OLDNEW 触发执行语句内容(trigger_body)中的OLDNEW:在trigger_body中, 我们可以使用NEW表示将要插入的新行(相当于MS SQL的INSERTED), OLD表示将要删除的旧行(相当于MS SQL的DELETED)。 通过OLDNEW中获取它们的字段内容,方便在触发操作中使用, 下面是对应事件是否支持OLDNEW的对应关系: 事件     OLD   NEW INSERT   ×     √ DELETE   √     × UPDATE   √     √ ​ 由于UPDATE相当于删除旧行(OLD),然后插入新行(NEW),所以UPDATE同时支持OLDNEW; DELIMITER $ ... --触发器创建语句; $   --提交创建语句; DELIMITER ; ​ ​ select * FROM information_schema.triggers; SHOW TRIGGERS; #查看触发器 -- 通过information_schema.triggers表查看触发器: select * FROM information_schema.triggers; -- mysql 查看当前数据库的触发器 SHOW TRIGGERS; -- mysql 查看指定数据库'people'的触发器 SHOW TRIGGERS FROM people; ​ 创建测试表 DROP TABLE IF EXISTS tb; CREATE TABLE IF NOT EXISTS tb(id INT,username CHAR(10),pass VARCHAR(20),ct INT); CREATE TABLE IF NOT EXISTS bt(fid INT,username CHAR(10),pass VARCHAR(20),ct INT); 创建触发器 DELIMITER $ #drop trigger if exists df_names$ 删除前先判断触发器是否存在 CREATE DEFINER =CURRENT_USER TRIGGER df_names BEFORE INSERT ON tb AFTER UPDATE ON bt FOR EACH ROW BEGIN   #set new.ct=new.id*5;   #SET @ct=12; 变量   #SET @pass='hjfd';   IF old.type=1 THEN UPDATE bt SET ct=old.ct WHERE fid=old.id;   ELSE IF old.type=2 THEN UPDATE bt SET pass=old.pass WHERE fid=old.id; END$ DELIMITER; ​ 测试 INSERT INTO tb(id) VALUES(4); SELECT *FROM tb; ​

4.索引

SET AUTOCOMMIT=off ;禁用或启用事务的自动提交模式  off ON
SET SESSION AUTOCOMMIT = OFF; 禁用或启用事务的session自动提交模式 off ON
SHOW VARIABLES LIKE '%auto%'; -- 查看变量状态
​
执行DML语句是其实就是开启一个事务
只能回滚insertdeleteupdate语句
对于createdropalter这些无法回滚事务只对DML有效果
rollback,或者commit后事务就结束了
自动提交模式用于决定新事务如何及何时启动
START TRANSACTION; 启用自动提交模式下显式地启动事务
COMMITROLLBACK;  禁用自动提交模式显式地提交或回滚
-- 事务 transaction 指一组sql语句
-- 回退 rollback 指撤销指定sql语句的过程
-- 提交 commit 指将未存储的sql语句结果写入数据库表
-- 保留点 savepoint 指事务处理中设置的临时占位符,可以对它发布回退(与回退整个事务处理不同)-- 控制事务处理
# 开始事务及回退 
SELECT * FROM ordertotals;   # 查看ordertotals表显示不为空
START TRANSACTION;           # 开始事务处理 
DELETE FROM ordertotals;     # 删除ordertotals表中所有行
SELECT * FROM ordertotals;   # 查看ordertotals表显示 为空
ROLLBACK;                     # rollback语句回退 
SELECT * FROM ordertotals;   # rollback后,再次查看ordertotals表显示不为空# commit 提交 
START TRANSACTION;
DELETE FROM orderitems WHERE order_num = 20010;
DELETE FROM orders WHERE order_num = 20010;
COMMIT;   # 仅在上述两条语句不出错时写出更改 # savepoint 保留点 
# 创建保留点
SAVEPOINT delete1;
# 回退到保留点 
ROLLBACK TO delete1;
# 释放保留点 
RELEASE SAVEPOINT delete1;
​
-- 更改默认的提交行为 
SET autocommit = 0;  # 设置autocommit为0(假)指示MySQL不自动提交更改

5.视图

1、MySQL触发器的创建语法: CREATE[DEFINER = { 'user' | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW [trigger_order] trigger_body 2、MySQL创建语法中的关键词解释: 字段                     含义                                               可能的值 DEFINER=           可选参数,指定创建者,                               DEFINER='root@%'             默认为当前登录用户(CURRENT_USER);             该触发器将以此参数指定的用户执行,                       DEFINER=CURRENT_USER                 所以需要考虑权限问题; ​ trigger_name   触发器名称,最好由表名 触发事件关键词 触发时间关键词组成;   trigger_time     触发时间,在某个事件之前还是之后;                   BEFOREAFTER ​   INSERT:插入操作触发器,INSERTLOAD DATAREPLACE时触发;   UPDATE:更新操作触发器,UPDATE操作时触发; trigger_event 触发事件,如插入时触发、删除时触发;           DELETE:删除操作触发器,DELETEREPLACE操作时触发;   INSERTUPDATEDELETE table_name          触发操作时间的表名;   可选参数,如果定义了多个具有相同触发事件和触法时间的触发器时( 如:BEFORE UPDATE),默认触发顺序与触发器的创建顺序一致,可以 trigger_order 使用此参数来改变它们触发顺序。mysql 5.7.2起开始支持此参数。 FOLLOWS:当前创建触发器在现有触发器之后激活;                 FOLLOWSPRECEDES PRECEDES:当前创建触发器在现有触发器之前激活; trigger_body     触发执行的SQL语句内容,一般以begin开头,end结尾            BEGIN .. END 触发执行语句内容(trigger_body)中的OLDNEW 触发执行语句内容(trigger_body)中的OLDNEW:在trigger_body中, 我们可以使用NEW表示将要插入的新行(相当于MS SQL的INSERTED), OLD表示将要删除的旧行(相当于MS SQL的DELETED)。 通过OLDNEW中获取它们的字段内容,方便在触发操作中使用, 下面是对应事件是否支持OLDNEW的对应关系: 事件     OLD   NEW INSERT   ×     √ DELETE   √     × UPDATE   √     √ ​ 由于UPDATE相当于删除旧行(OLD),然后插入新行(NEW),所以UPDATE同时支持OLDNEW; DELIMITER $ ... --触发器创建语句; $   --提交创建语句; DELIMITER ; ​ ​ select * FROM information_schema.triggers; SHOW TRIGGERS; #查看触发器 -- 通过information_schema.triggers表查看触发器: select * FROM information_schema.triggers; -- mysql 查看当前数据库的触发器 SHOW TRIGGERS; -- mysql 查看指定数据库'people'的触发器 SHOW TRIGGERS FROM people; ​ 创建测试表 DROP TABLE IF EXISTS tb; CREATE TABLE IF NOT EXISTS tb(id INT,username CHAR(10),pass VARCHAR(20),ct INT); CREATE TABLE IF NOT EXISTS bt(fid INT,username CHAR(10),pass VARCHAR(20),ct INT); 创建触发器 DELIMITER $ #drop trigger if exists df_names$ 删除前先判断触发器是否存在 CREATE DEFINER =CURRENT_USER TRIGGER df_names BEFORE INSERT ON tb AFTER UPDATE ON bt FOR EACH ROW BEGIN   #set new.ct=new.id*5;   #SET @ct=12; 变量   #SET @pass='hjfd';   IF old.type=1 THEN UPDATE bt SET ct=old.ct WHERE fid=old.id;   ELSE IF old.type=2 THEN UPDATE bt SET pass=old.pass WHERE fid=old.id; END$ DELIMITER; ​ 测试 INSERT INTO tb(id) VALUES(4); SELECT *FROM tb; ​

6.函数

SET AUTOCOMMIT=off ;禁用或启用事务的自动提交模式  off ON
SET SESSION AUTOCOMMIT = OFF; 禁用或启用事务的session自动提交模式 off ON
SHOW VARIABLES LIKE '%auto%'; -- 查看变量状态
​
执行DML语句是其实就是开启一个事务
只能回滚insertdeleteupdate语句
对于createdropalter这些无法回滚事务只对DML有效果
rollback,或者commit后事务就结束了
自动提交模式用于决定新事务如何及何时启动
START TRANSACTION; 启用自动提交模式下显式地启动事务
COMMITROLLBACK;  禁用自动提交模式显式地提交或回滚
-- 事务 transaction 指一组sql语句
-- 回退 rollback 指撤销指定sql语句的过程
-- 提交 commit 指将未存储的sql语句结果写入数据库表
-- 保留点 savepoint 指事务处理中设置的临时占位符,可以对它发布回退(与回退整个事务处理不同)-- 控制事务处理
# 开始事务及回退 
SELECT * FROM ordertotals;   # 查看ordertotals表显示不为空
START TRANSACTION;           # 开始事务处理 
DELETE FROM ordertotals;     # 删除ordertotals表中所有行
SELECT * FROM ordertotals;   # 查看ordertotals表显示 为空
ROLLBACK;                     # rollback语句回退 
SELECT * FROM ordertotals;   # rollback后,再次查看ordertotals表显示不为空# commit 提交 
START TRANSACTION;
DELETE FROM orderitems WHERE order_num = 20010;
DELETE FROM orders WHERE order_num = 20010;
COMMIT;   # 仅在上述两条语句不出错时写出更改 # savepoint 保留点 
# 创建保留点
SAVEPOINT delete1;
# 回退到保留点 
ROLLBACK TO delete1;
# 释放保留点 
RELEASE SAVEPOINT delete1;
​
-- 更改默认的提交行为 
SET autocommit = 0;  # 设置autocommit为0(假)指示MySQL不自动提交更改

7.游标

创建、打开、关闭游标 # 定义名为ordernumbers的游标,检索所有订单 DELIMITER // CREATE PROCEDURE processorders() BEGIN     -- decalre the cursor 声明游标      declare ordernumbers CURSOR     FOR     SELECT order_num FROM orders;          -- open the cursor 打开游标     open ordernumbers;     -- close the cursor 关闭游标     close ordernumbers; END // DELIMITER ; ​ -- 使用游标数据  # 例1:检索 当前行 的order_num列,对数据不做实际处理 DELIMITER // CREATE PROCEDURE processorders() BEGIN ​     -- declare local variables 声明局部变量     DECLARE o INT;          -- decalre the cursor 声明游标      declare ordernumbers CURSOR     FOR     SELECT order_num FROM orders;          -- open the cursor 打开游标     open ordernumbers;          -- get order number 获得订单号      FETCH ordernumbers INTO o;     /*fetch检索 当前行 的order_num列(将自动从第一行开始)到一个名为o的局部声明变量中。     对检索出的数据不做任何处理。*/              -- close the cursor 关闭游标     close ordernumbers; ​ END // DELIMITER ; ​ # 例2:循环检索数据,从第一行到最后一行,对数据不做实际处理 DELIMITER // CREATE PROCEDURE processorders() BEGIN     -- declare local variables 声明局部变量     DECLARE done BOOLEAN DEFAULT 0;     DECLARE o INT;         -- decalre the cursor 声明游标      declare ordernumbers CURSOR     FOR     SELECT order_num FROM orders;         -- declare continue handler     DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done =1;     -- SQLSTATE '02000'是一个未找到条件,当REPEAT由于没有更多的行供循环而不能继续时,出现这个条件。          -- open the cursor 打开游标     open ordernumbers;          -- loop through all rows 遍历所有行      REPEAT          -- get order number 获得订单号      FETCH ordernumbers INTO o;     -- FETCH在REPEAT内,因此它反复执行直到done为真          -- end of loop     UNTIL done END REPEAT;          -- close the cursor 关闭游标     close ordernumbers; ​ END // DELIMITER ; ​ ​ # 例3:循环检索数据,从第一行到最后一行,对取出的数据进行某种实际的处理 DELIMITER // CREATE PROCEDURE processorders() BEGIN     -- declare local variables 声明局部变量      DECLARE done BOOLEAN DEFAULT 0;     DECLARE o INT;     DECLARE t DECIMAL(8,2);          -- declare the cursor 声明游标     DECLARE ordernumbers CURSOR     FOR     SELECT order_num FROM orders;          -- declare continue handler     DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;          -- create a table to store the results 新建表以保存数据     CREATE TABLE IF NOT EXISTS ordertotals     (order_num INT,total DECIMAL(8,2));          -- open the cursor 打开游标     OPEN ordernumbers;          -- loop through all rows 遍历所有行     REPEAT          -- get order number 获取订单号     FETCH ordernumbers INTO o;          -- get the total for this order 计算订单金额     CALL ordertotal(o,1,t);  # 参见23章代码,已创建可使用          -- insert order and total into ordertotals 将订单号、金额插入表ordertotals内     INSERT INTO ordertotals(order_num,total) VALUES(o,t);          -- end of loop     UNTIL done END REPEAT;          -- close the cursor 关闭游标     close ordernumbers; ​ END //  DELIMITER ; # 调用存储过程 precessorders() CALL processorders(); # 输出结果 SELECT * FROM ordertotals; ​

8.触发器

1、MySQL触发器的创建语法:
CREATE[DEFINER = { 'user' | CURRENT_USER }]
TRIGGER trigger_name
trigger_time trigger_event
ON table_name
FOR EACH ROW
[trigger_order]
trigger_body
2、MySQL创建语法中的关键词解释:
字段                      含义                                               可能的值
DEFINER=            可选参数,指定创建者,                               DEFINER='root@%'
              默认为当前登录用户(CURRENT_USER);
              该触发器将以此参数指定的用户执行,                       DEFINER=CURRENT_USER
                  所以需要考虑权限问题;
​
trigger_name   触发器名称,最好由表名 触发事件关键词 触发时间关键词组成;
 
trigger_time     触发时间,在某个事件之前还是之后;                   BEFOREAFTER
​
                                   INSERT:插入操作触发器,INSERTLOAD DATAREPLACE时触发;
                                   UPDATE:更新操作触发器,UPDATE操作时触发;
trigger_event  触发事件,如插入时触发、删除时触发;              DELETE:删除操作触发器,DELETEREPLACE操作时触发;
                                   INSERTUPDATEDELETE
table_name          触发操作时间的表名;
 
        可选参数,如果定义了多个具有相同触发事件和触法时间的触发器时(
        如:BEFORE UPDATE),默认触发顺序与触发器的创建顺序一致,可以
trigger_order   使用此参数来改变它们触发顺序。mysql 5.7.2起开始支持此参数。
        FOLLOWS:当前创建触发器在现有触发器之后激活;                  FOLLOWSPRECEDES
        PRECEDES:当前创建触发器在现有触发器之前激活;
        
        
trigger_body     触发执行的SQL语句内容,一般以begin开头,end结尾            BEGIN .. END
         触发执行语句内容(trigger_body)中的OLDNEW
触发执行语句内容(trigger_body)中的OLDNEW:在trigger_body中,
我们可以使用NEW表示将要插入的新行(相当于MS SQL的INSERTED),
OLD表示将要删除的旧行(相当于MS SQL的DELETED)。
通过OLDNEW中获取它们的字段内容,方便在触发操作中使用,
下面是对应事件是否支持OLDNEW的对应关系:
事件     OLD   NEW
INSERT    ×     √
DELETE    √     ×
UPDATE    √     √
​
由于UPDATE相当于删除旧行(OLD),然后插入新行(NEW),所以UPDATE同时支持OLDNEW;
DELIMITER $
... --触发器创建语句;
$   --提交创建语句;
DELIMITER ;
​
​
select * FROM information_schema.triggers;
SHOW TRIGGERS; #查看触发器
-- 通过information_schema.triggers表查看触发器:
select * FROM information_schema.triggers;
-- mysql 查看当前数据库的触发器
SHOW TRIGGERS;
-- mysql 查看指定数据库'people'的触发器
SHOW TRIGGERS FROM people;
​
创建测试表
DROP TABLE IF EXISTS tb;
CREATE TABLE IF NOT EXISTS tb(id INT,username CHAR(10),pass VARCHAR(20),ct INT);
CREATE TABLE IF NOT EXISTS bt(fid INT,username CHAR(10),pass VARCHAR(20),ct INT);
创建触发器
DELIMITER $
#drop trigger if exists df_names$ 删除前先判断触发器是否存在
CREATE  DEFINER =CURRENT_USER
TRIGGER df_names
BEFORE INSERT ON tb
AFTER UPDATE ON bt
FOR EACH ROW
BEGIN
   #set new.ct=new.id*5;
   #SET @ct=12; 变量
   #SET @pass='hjfd';
   IF old.type=1 THEN
    UPDATE bt SET ct=old.ct WHERE fid=old.id;
   ELSE IF old.type=2 THEN
    UPDATE bt SET pass=old.pass WHERE fid=old.id;
END$
DELIMITER;
​
测试
INSERT INTO tb(id) VALUES(4);
SELECT *FROM tb;
​

9.存储过程

SET AUTOCOMMIT=off ;禁用或启用事务的自动提交模式 off ON SET SESSION AUTOCOMMIT = OFF; 禁用或启用事务的session自动提交模式 off ON SHOW VARIABLES LIKE '%auto%'; -- 查看变量状态 ​ 执行DML语句是其实就是开启一个事务 只能回滚insertdeleteupdate语句 对于createdropalter这些无法回滚事务只对DML有效果 rollback,或者commit后事务就结束了 自动提交模式用于决定新事务如何及何时启动 START TRANSACTION; 启用自动提交模式下显式地启动事务 COMMITROLLBACK; 禁用自动提交模式显式地提交或回滚 -- 事务 transaction 指一组sql语句 -- 回退 rollback 指撤销指定sql语句的过程 -- 提交 commit 指将未存储的sql语句结果写入数据库表 -- 保留点 savepoint 指事务处理中设置的临时占位符,可以对它发布回退(与回退整个事务处理不同)-- 控制事务处理 # 开始事务及回退  SELECT * FROM ordertotals;   # 查看ordertotals表显示不为空 START TRANSACTION;           # 开始事务处理  DELETE FROM ordertotals;     # 删除ordertotals表中所有行 SELECT * FROM ordertotals;   # 查看ordertotals表显示 为空 ROLLBACK;                     # rollback语句回退  SELECT * FROM ordertotals;   # rollback后,再次查看ordertotals表显示不为空# commit 提交  START TRANSACTION; DELETE FROM orderitems WHERE order_num = 20010; DELETE FROM orders WHERE order_num = 20010; COMMIT;   # 仅在上述两条语句不出错时写出更改 # savepoint 保留点  # 创建保留点 SAVEPOINT delete1; # 回退到保留点  ROLLBACK TO delete1; # 释放保留点  RELEASE SAVEPOINT delete1; ​ -- 更改默认的提交行为  SET autocommit = 0;  # 设置autocommit为0(假)指示MySQL不自动提交更改

10.事务

SET AUTOCOMMIT=off ;禁用或启用事务的自动提交模式  off ON
SET SESSION AUTOCOMMIT = OFF; 禁用或启用事务的session自动提交模式 off ON
SHOW VARIABLES LIKE '%auto%'; -- 查看变量状态
​
执行DML语句是其实就是开启一个事务
只能回滚insertdeleteupdate语句
对于createdropalter这些无法回滚事务只对DML有效果
rollback,或者commit后事务就结束了
自动提交模式用于决定新事务如何及何时启动
START TRANSACTION; 启用自动提交模式下显式地启动事务
COMMITROLLBACK;  禁用自动提交模式显式地提交或回滚
-- 事务 transaction 指一组sql语句
-- 回退 rollback 指撤销指定sql语句的过程
-- 提交 commit 指将未存储的sql语句结果写入数据库表
-- 保留点 savepoint 指事务处理中设置的临时占位符,可以对它发布回退(与回退整个事务处理不同)-- 控制事务处理
# 开始事务及回退 
SELECT * FROM ordertotals;   # 查看ordertotals表显示不为空
START TRANSACTION;           # 开始事务处理 
DELETE FROM ordertotals;     # 删除ordertotals表中所有行
SELECT * FROM ordertotals;   # 查看ordertotals表显示 为空
ROLLBACK;                     # rollback语句回退 
SELECT * FROM ordertotals;   # rollback后,再次查看ordertotals表显示不为空# commit 提交 
START TRANSACTION;
DELETE FROM orderitems WHERE order_num = 20010;
DELETE FROM orders WHERE order_num = 20010;
COMMIT;   # 仅在上述两条语句不出错时写出更改 # savepoint 保留点 
# 创建保留点
SAVEPOINT delete1;
# 回退到保留点 
ROLLBACK TO delete1;
# 释放保留点 
RELEASE SAVEPOINT delete1;
​
-- 更改默认的提交行为 
SET autocommit = 0;  # 设置autocommit为0(假)指示MySQL不自动提交更改

11.备份与还原

备份一个数据库:mysqldump -u root -p --opt people> df.txt  #--opt优化执行速度 备份两个数据库:mysqldump -u root -p --opt --databases people hw > all.txt 备份全部数据库:mysqldump -u root -p --opt --all-DATABASES > all.txt 恢复数据库:mysqldump -u root -p --opt --databases people hw < all.txt 1. 导出一张表 mysqldump -u用户名 -p密码 库名 表名 > 文件名(D:/a.sql) 2. 导出多张表 mysqldump -u用户名 -p密码 库名 表123 > 文件名(D:/a.sql) 3. 导出所有表 mysqldump -u用户名 -p密码 库名 > 文件名(D:/a.sql) 4. 导出一个库 mysqldump -u用户名 -p密码 --lock-ALL-TABLES --database 库名 > 文件名(D:/a.sql) 可以-w携带WHERE条件

12.用户账号

创建账户:CREATE USER IF NOT EXISTS 'hw'@'localhost' IDENTIFIED BY '5201314'; #创建用户hw,密码5201314
​
给该用户授予所有权限并可授权给其他用户:GRANT ALL PRIVILEGES ON people.df TO 'hw'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;
​
重命名用户名: RENAME USER 'hw' TO 'gh'; 必须将localhost改为%
如果希望该用户能够在任何机器上登陆mysql,则将localhost改为 '%' 
授权给其他用户 WITH GRANT OPTION
 privileges包括:
    alter:修改数据库的表
    create:创建新的数据库或表
    delete:删除表数据
    drop:删除数据库/表
    index:创建/删除索引
    insert:添加表数据
    select:查询表数据
    update:更新表数据
    all:允许任何操作
    usage:只允许登录
​
刷新权限,使新创建的用户能够使用:    FLUSH PRIVILEGES; 
                  
收回用户权限: REVOKE ALL PRIVILEGES ON people.df FROM 'root'@'localhost';
          
删除用户:    DROP USER IF EXISTS 'hw'@'localhost';
​
设置指定用户的密码:SET PASSWORD FOR'hw'@'localhost' = PASSWORD('123321'); 
                UPDATE USER SET PASSWORD =  PASSWORD('123321') WHERE USER = 'hw';
​
                  
设置密码:    SET PASSWORD = PASSWORD('123321');
         

13.其他

SHOW STATUS;显示广泛的服务器状态信息 SHOW PROCEDURE STATUS; SHOW GRANTS;显示授予用户的安全权限 SHOW ERRORS;显示服务器的错误信息 SHOW WARNINGS;显示服务器的警告信息 SHOW PROCESSLIST;显示哪些线程正在运行 SHOW VARIABLES;显示系统变量信息 SELECT DATABASE(); 查看当前数据库 SELECT NOW(), USER(), VERSION():显示当前时间、用户名、数据库版本 SHOW ENGINES 引擎名 {LOGS|STATUS}:显示存储引擎的日志和状态信息 SHOW VARIABLES LIKE 'character%'; SHOW VARIABLES LIKE 'collation%'; 确定所用系统的字符集和校对 SHOW VARIABLES LIKE 'character_set_client%';       客户端向服务器发送数据时使用的编码 SHOW VARIABLES LIKE 'character_set_results%';       服务器端将结果返回给客户端所使用的编码 SHOW VARIABLES LIKE 'character_set_connection%';    连接层编码 SHOW CHARACTER SET;查看所支持的字符集完整列表 SHOW COLLATION;查看所支持校对的完整列表,以及它们适用的字符集 ​ SET character_set_client = gbk;    SET character_set_results = gbk; SET character_set_connection = gbk; SET NAMES GBK;  -- 相当于完成以上三个设置 ​ 创建window服务:sc CREATE mysql binPath= mysqld_bin_path 数据文件目录:DATA DIRECTORY='目录' 索引文件目录:INDEX DIRECTORY = '目录'

希望能帮到大家,谢谢!!!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多