MYSQL 基本语法(中篇)

@[TOC]

MYSQL 自动提交模式(autocommit)

在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。

自动提交是处理事务的一种处理方式, 也就是说, 只有使用了 Innodb 数据库引擎才支持 autocommit

自动提交模式分会话系统变量与全局系统变量, 查看方式如下 :

code

--- 会话系统变量
SHOW SESSION VARIABLES LIKE "autocommit";
SHOW VARIABLES LIKE "autocommit";

--- 全局系统变量
SHOW GLOBAL VARIABLES LIKE "autocommit";

如下 : 是我没有更改提交模式下查询的结果, value 为 on 表示开启, off 表示关闭, 可见系统默认是开启自动提交模式的

shell

mysql> SHOW SESSION VARIABLES LIKE "autocommit";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set, 1 warning (0.67 sec)

mysql> SHOW GLOBAL VARIABLES LIKE "autocommit";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set, 1 warning (0.19 sec)

MySQL 中可以直接用 SET 来改变 MySQL 的自动提交模式

  • 开启自动提交模式

    SET [SESSION][GLOBAL] AUTOCOMMIT = 1;

  • 关闭自动提交模式

    SET [SESSION][GLOBAL] AUTOCOMMIT = 0;

首先, 我们不做任何处理, 也就是说, 让会话和全局的自动提交模式都为 ON(开启)

code

--- 创建一个数据库 test, 并创建表1 table01, 定义初始字段 id, name, age
CREATE DATABASE test;
USE test;
CREATE TABLE table01 (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), age INT(3));
SHOW COLUMNS FROM table01;

执行结果如下

shell

mysql> CREATE DATABASE test;
Query OK, 1 row affected (1.67 sec)

mysql> USE test;
Database changed
mysql> CREATE TABLE table01 (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), age INT(3));
Query OK, 0 rows affected, 1 warning (2.71 sec)

mysql> SHOW COLUMNS FROM table01;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int         | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20) | YES  |     | NULL    |                |
| age   | int         | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.30 sec)

接下来, 我们要打开两个控制台, 控制台 1 是目前这个控制台, 控制台 2 是新开的控制台

在控制台 1 中插入一行数据到 table01 中, 代码如下

code

--- 控制台1 输入
INSERT INTO table01 (name, age) VALUES ("TOM", 25);
SELECT * FROM table01;

--- 控制台2 登录数据库, 并选择 test数据库 输入
SELECT * FROM table01;

运行结果如下, 说明数据插入成功

shell 控制台 1

mysql> INSERT INTO table01 (name, age) VALUES ("TOM", 25);
Query OK, 1 row affected (0.61 sec)

mysql> SELECT * FROM table01;
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | TOM  |   25 |
+----+------+------+
1 row in set (0.01 sec)

shell 控制台 2

mysql> SELECT * FROM table01;
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | TOM  |   25 |
+----+------+------+
1 row in set (0.00 sec)

可见, 当自动提交开启时, 每个 DML 操作语句都会被视为一个完整的事务, 立即进行隐式提交, 除非显示创建一条事务;

当显示创建一条事务时, 如下

code

--- 控制台 1
INSERT INTO table01 (name) VALUES ("Lucy");
SELECT * FROM table01;

--- 控制台 2
SELECT * FROM table01;

shell 控制台 1

mysql> INSERT INTO table01 (name) VALUES ("Lucy");
Query OK, 1 row affected (0.02 sec)

mysql> SELECT * FROM table01;
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | TOM  |   25 |
|  2 | Lucy | NULL |
+----+------+------+
2 rows in set (0.00 sec)

shell 控制台 2

mysql> SELECT * FROM table01;
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | TOM  |   25 |
+----+------+------+
1 row in set (0.00 sec)

可见, 当显式开启事务时, 如果没有手动提交, 即使自动提交开启了, 也不会自动提交, 必须我们
使用 commit; 或 begin; 手动提交

如果, 我们把自动提交关闭, 再插入一条数据试试;

code

--- 控制台 1
SET AUTOCOMMIT = 0;
SHOW VARIABLES LIKE "autocommit";
INSERT INTO table01 (name) VALUES ("autocommit-off");
SELECT * FROM table01;

--- 控制台 2
SHOW VARIABLES LIKE "autocommit";
SELECT * FROM table01;

shell 控制台 1

mysql> SET AUTOCOMMIT = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW VARIABLES LIKE "autocommit";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | OFF   |
+---------------+-------+
1 row in set, 1 warning (0.00 sec)

mysql> INSERT INTO table01 (name) VALUES ("autocommit-off");
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM table01;
+----+----------------+------+
| id | name           | age  |
+----+----------------+------+
|  1 | TOM            |   25 |
|  2 | Lucy           | NULL |
|  3 | autocommit-off | NULL |
+----+----------------+------+
3 rows in set (0.00 sec)

shell 控制台 2

mysql> SHOW VARIABLES LIKE "autocommit";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set, 1 warning (0.00 sec)

mysql> SELECT * FROM table01;
+----+------+------+
| id | name | age  |
+----+------+------+
|  1 | TOM  |   25 |
+----+------+------+
1 row in set (0.00 sec)

综上运行结果可知, 当自动提交关闭时, 在单个控制台上的 DML 操作已经不再自动提交, 需要手动提交才能提交事务, 如下是我在控制台 1 使用手动提交 控制台 2 的结果
shell 控制台 2

mysql> SELECT * FROM table01;
+----+----------------+------+
| id | name           | age  |
+----+----------------+------+
|  1 | TOM            |   25 |
|  2 | Lucy           | NULL |
|  3 | autocommit-off | NULL |
+----+----------------+------+
3 rows in set (0.00 sec)

当然,事务处理是为了保障表数据原子性、一致性、隔离性、持久性。这些都是要消耗系统资源的,要谨慎选择。

MySQL SQL 注入 (略) 请移步 菜鸟教程

MySQL 导出数据

MySQL 导出要有 secure-file-priv 指定的路径, 可以使用 show variables like %secure% 来查看该值

默认有可能是 NULL 就代表禁止导出,所以需要设置一下才能正常导出

找到 mysql 安装路径下的 my.ini 文件(没有的话自己创建),设置一下路径:
找到或添加 secure_file_priv, 等于号后面的是地址,注意地址分割使用 /, 而不是 \

secure-file-priv 的值有三种情况:

  • secure_file_prive=null 限制 mysqld 不允许导入导出
  • secure_file_priv=/path/ 限制 mysqld 的导入导出只能发生在默认的/path/目录下
  • secure_file_priv=’’ 不对 mysqld 的导入 导出做限制
[mysqld]
port = 3306
basedir=D:/Installs/mysql-8.0.19-winx64
datadir=D:/Installs/mysql-8.0.19-winx64/data
max_connections=200
character-set-server=utf8
default-storage-engine=INNODB
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
secure_file_priv=""
[mysql]
default-character-set=utf8

重启服务器

  • 我的电脑 => 右键管理 => 服务和应用程序 => 服务 => MySql 右键重启

MySql 将数据导出

SELECT * FROM table_name INTO OUTFILE '路径';

code

--- 指定导出字段, 字段之间用逗号分隔, 数据用 ' 号包围, 一行数据后换行
SELECT id, name, age INTO OUTFILE "E:/SPIRIT/study/temp/temp.txt"
FIELDS TERMINATED BY ","
OPTIONALLY ENCLOSED BY "'"
LINES TERMINATED BY '\n'
FROM table01;

导出内容如下

temp.txt

1,'TOM',25
2,'Lucy',\N
3,'autocommit-off',\N

导出 SQL 格式的数据

导出指定表的数据

mysqldump -u root -p database_name table_name > 导出路径(指定文件)

导出整个数据库的数据

mysqldump -u root -p database_name > 导出路径(指定文件)

备份所有数据库

mysqldump -u root -p --all-databases > 导出路径(指定文件)

code

--- 导出指定表的数据
mysqldump -u root -p test table01 > "E:\SPIRIT\study\temp\dump.txt"
password ********

导出内容过多我就不贴出来了

MySQL 导入数据

语法 :

  1. mysql 命令导入
    mysql -u 用户名 -p 密码 < 要导入的数据库数据 .sql 文件
  2. source 命令导入 (source 命令导入数据库需要先登录到数库终端)
    source .sql文件路径
  3. 使用 LOAD DATA 导入数据
    LOAD DATA LOCAL INFILE '指定文件路径' INTO TABLE 数据表;

code 1

$ mysql -u root -p < "E:\SPIRIT\study\temp\test.sql"

code 2

mysql> create database abc;      # 创建数据库
mysql> use abc;                  # 使用已创建的数据库
mysql> set names utf8;           # 设置编码
mysql> source "E:\SPIRIT\study\temp\test.sql"  # 导入备份数据库

code 3

mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE test;

MySQL 函数 (略) 请移步 菜鸟教程

MySQL 运算符 (略) 请移步 菜鸟教程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 1.A simple master-to-slave replication is currently being...
    Kevin关大大阅读 5,955评论 0 3
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,374评论 0 5
  • django migrate 冲突解决 冲突起因, makemigrations 记录sql的变化, migrat...
    hugoren阅读 849评论 0 0
  • 什么是数据库? 数据库是存储数据的集合的单独的应用程序。每个数据库具有一个或多个不同的API,用于创建,访问,管理...
    chen_000阅读 4,032评论 0 19
  • 1,MySQL权限体系 mysql 的权限体系大致分为5个层级: 全局层级: 全局权限适用于一个给定服务器中的所有...
    不排版阅读 942评论 0 4