1. 数据库备份与恢复

  数据库备份用命令mysqldump ,MySQL的备份文件一般以.sql结尾,做到见名知意

#备份testdb数据库重定向为testdb.sql文件,
[root@localhost ~]# mysqldump -uroot -p123 --databases testdb > testdb.sql #备份所有的数据库
[root@localhost ~]# mysqldump -uroot -p123 --all-databases > all_databases.sql #查看备份的文件
[root@localhost ~]# ls
all_databases.sql testdb.sql
[root@localhost ~]#vimttestdb.mysql
………
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `testdb` /*!40100 DEFAULT CHARACTER SET utf8 */; USE `testdb`; --
-- Table structure for table `areas`
-- DROP TABLE IF EXISTS `areas`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `areas` (
`aid` int() NOT NULL AUTO_INCREMENT,
`name` varchar() DEFAULT NULL,
`pid` int() DEFAULT NULL,
PRIMARY KEY (`aid`)
) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */; --
-- Dumping data for table `areas`
-- LOCK TABLES `areas` WRITE;
/*!40000 ALTER TABLE `areas` DISABLE KEYS */;
INSERT INTO `areas` VALUES (,'北京市',NULL),(,'天津市',NULL),(,'河北省',NULL),(,'山西省
',NULL),(5,'海淀区',1),(6,'滨海区',2),(7,'沧州市',3),(8,'大同市',4),(9,'朝阳区',1),(10,'武>清区',2),(11,'石家庄',3),(12,'太原市',4),(13,'西二旗',5),(14,'大港',6),(15,'任丘市',7),(16,'清徐',8),(17,'中关村',5),(18,'汉沽',6),(19,'河间市',7),(20,'阳曲',8);
/*!40000 ALTER TABLE `areas` ENABLE KEYS */;
UNLOCK TABLES;
…….. #恢复用命令source
MariaDB [(none)]> drop database testdb;
Query OK, rows affected (0.082 sec)
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
rows in set (0.000 sec)
MariaDB [(none)]> source testdb.sql #导入备份文件
Query OK, rows affected (0.001 sec)
Query OK, rows affected (0.000 sec)
Query OK, rows affected (0.000 sec)
…….
MariaDB [testdb]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| testdb |
+--------------------+ #备份数据库下的某个表,先跟数据库名,再跟表名,如备份testdb下的students表:
MariaDB [testdb]> exit
Bye
[root@localhost ~]# mysqldump -uroot -proot testdb students > students.sql
[root@localhost ~]# ls
all_databases.sql students.sql testdb.sql #库名后跟的表名可以是多个,以空格分开,即备份同一数据库下的多个表
[root@localhost ~]# mysqldump -uroot -p123 testdb students classes areas > bak.sql
[root@localhost ~]# ls
all_databases.sql students.sql testdb.sql bak.sql

2. 视图

  对于复杂的查询,在多个地方被使用,如果需求发生了改变,需要更改sql语句,则需要在多个地方进行修改,维护起来非常麻烦,

  假如因为业务需要将某一表拆分为另外两份表,相对来说原来的表没有了,如果要继续使用该表有两种方案:找前端人员要求每个前端人员将他们相关的调用语句修改了,第二种方法是通过某种方法使得查看原来的表时让它“存在”,此时的表并不是真正的表,而是视图。当然,利用视图的方法更好。

2.1 创建视图

  格式: create view 视图名称 as select语句;

  视图与表的效果相近,因此在创建视图的名称是一般以v_开头表名是视图文件。

  创建视图所含的表如果有相同的字段名必须在创建过程中起别名,使得新创建的一个“表”仅有一个相同的字段,如下列所示。

MariaDB [testdb]> create view v_students as select * from classes inner join students where classes.id=students.cls_id;
ERROR (42S21): Duplicate column name 'id' #重复的id列名
MariaDB [testdb]> create view v_students as select classes.name as cl_name,students.name as stu_name from classes inner join students where classes.id=students.cls_id;
MariaDB [testdb]> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| areas |
| classes |
| students |
| v_students |
+------------------+

2.2  查看视图

  格式:show tables ,查看表会将所有的视图也列出来

MariaDB [testdb]> select * from v_students order by cl_name;
#查看将两个表联系起来的一个“表”,即视图
+-------------+-------------+
| cl_name | stu_name |
+-------------+-------------+
| 云唯_01期 | 周杰伦儿 |
| 云唯_01期 | 钱小豪 |
| 云唯_01期 | 陈冠希 |
| 云唯_01期 | 小明 |
| 云唯_01期 | 彭于晏 |
| 云唯_01期 | 黄蓉 |
| 云唯_01期 | 王祖贤 |
| 云唯_01期 | 周杰 |
| 云唯_01期 | 谢霆锋 |
| 云唯_02期 | 小月月 |
| 云唯_02期 | 刘德华 |
| 云唯_02期 | 凤姐 |
| 云唯_02期 | 和珅 |
| 云唯_02期 | 程坤 |
+-------------+--------------+

2.3 删除视图

  格式:drop view 视图名

MariaDB [testdb]> drop view v_students;
Query OK, rows affected (0.000 sec)
MariaDB [testdb]> show tables;
+---------------------+
| Tables_in_testdb |
+---------------------+
| areas |
| classes |
| students |
+---------------------+

3. 事务

  假设A欠了B 500 元,A现在给B还钱,对数据库而言,还钱有三个步骤:

    1、检查A的账户余额>500元;

    2、A 账户中扣除500元;

    3、B 账户中增加500元。

  如果A现已将前从自己的账户中扣除,在B还没有收到数据库的数据时数据库宕了,会出现A已经将钱从自己账户扣除、B的账户并没有增加的现象。

  但现实中对数据库来说这种情况是不存在的,因为数据库存在事务这个概念。

  将上述步骤的操作打包成一个事务中,任何一个步骤失败,则必须回滚所有步骤。

数据库中事务默认是关闭的,使用start transaction或begin开启一个事务,完成操作后使用commit命令提交修改或使用rollback撤销所有修改。

3.1  事务的ACID特性

  1)原子性(A,atomicity):事务内的所有操作要么都执行,要么都不执行,视所有操作步骤为一个整体,它是一个不可分割的工作单位。一个执行步骤失败,全部步骤失败,全部步骤成功任务才成功。

  2)一致性(C,consistency):数据库的前后一致,数据库总是从一个一致性的状态转换到另一个一致性的状态。

  3)隔离性(I,isolation):一个事物所做的修改在最终提交之前,对其他事物是不可见的。

  4)持久性(D,durability):将数据写入磁盘当中实现永久保存。事务完成后,该事务内涉及的数据必须持久性的写入磁盘保证其持久性。当然,这是从事务的角度来考虑的的持久性,从操作系统故障或硬件故障来说,这是不一定的。

3.2  事务命令

  要求:表的引擎类型必须是innodb类型才可以使用事务,这是mysql表的默认引擎。

  查看表的创建语句,可以看到engine=innodb。

  命令:

  show create table students;

  修改数据的命令会触发事务,包括insert、update、delete

  开启事务:begin,开启事务后执行修改命令,变更会维护到本地缓存中,而不维护到物理表中。

  提交事务:commit,将缓存中的数据变更维护到物理表中。

  回滚事务:rollback,放弃缓存中变更的数据。

  结束事务:commit和rollback均可结束事务。

#为了体现隔离性,开启两个窗口1和2
#窗口1:
MariaDB [testdb]> select * from students;
+---+---------------+------+--------+--------+-------+-----------+
| id | name | age | high | gender |cls_id | is_delete |
+----+--------------+------+--------+-------+--------+-----------+
| | 小明 | | 180.00 | 男 | | |
| | 小月月 | | 180.00 | 男 | | |
| | 彭于晏 | | 185.00 | 男 | | |
| | 刘德华 | | 175.00 | 男 | | |
| | 黄蓉 | | 160.00 | 女 | | |
| | 凤姐 | | 150.00 | 保密 | | |
| | 王祖贤 | | 170.00 | 女 | | |
| | 周杰伦儿 | | NULL | 男 | | |
| | 程坤 | | 181.00 | 男 | | |
| | 和珅 | | 166.00 | 男 | | |
| | 刘亦菲 | | 162.00 | 女 | | |
| | 金星 | | 180.00 | 中性 | | |
| | 静香 | | 170.00 | 女 | | |
| | 郭靖 | | 167.00 | 男 | | |
| | 周杰 | | 178.00 | 男 | | |
| | 钱小豪 | | 178.00 | 男 | | |
| | 谢霆锋 | | 175.00 | 男 | | |
| | 陈冠希 | | 175.00 | 男 | | |
+----+-------------+------+--------+--------+--- ----+-----------+
MariaDB [testdb]> begin; #开启事务
MariaDB [testdb]> delete from students where id=;
MariaDB [testdb]> delete from students where id=; #删除两条数据
MariaDB [testdb]> select * from students;
………
| | 周杰 | | 178.00 | 男 | | |
| | 钱小豪 | | 178.00 | 男 | | |
+----+-------------+------+--------+--------+--------+-----------+ #窗口2:
MariaDB [testdb]> select * from students;
…….
| | 钱小豪 | | 178.00 | 男 | | |
| | 谢霆锋 | | 175.00 | 男 | | |
| | 陈冠希 | | 175.00 | 男 | | |
+-- -+-------------+------+--------+--------+--------+-----------+
#此时窗口1并没有提交(commit),切换到窗口2查看students表,发现并没有删掉该该两条数据,这便是事务的隔离性,一个事务最终修改在提交之前对其他事务是不可见的。 #窗口1:
MariaDB [testdb]> commit; #提交
#窗口2:
MariaDB [testdb]> select * from students;
………
| | 周杰 | | 178.00 | 男 | | |
| | 钱小豪 | | 178.00 | 男 | | |
+---+--------------+------+--------+--------+--------+-----------+
MariaDB [testdb]> begin; #开启事务
Query OK, rows affected (0.000 sec)
MariaDB [testdb]> delete from students where id=; #删掉一行数据
Query OK, row affected (0.002 sec)
MariaDB [testdb]> select * from students;
…….
| | 郭靖 | | 167.00 | 男 | | |
+---+--------------+------+--------+--------+--------+-----------+
MariaDB [testdb]> rollback; #回退,后结束事务
Query OK, rows affected (0.000 sec)
MariaDB [testdb]> select * from students;
…….
| | 周杰 | | 178.00 | 男 | | |
+---+--------------+------+--------+--------+--------+-----------+ #事务之中一个步骤出错,所有步骤出错:
MariaDB [testdb]> begin;
Query OK, rows affected (0.000 sec)
MariaDB [testdb]> delete from students where id=;
Query OK, row affected (0.000 sec)
MariaDB [testdb]> delete from students where id=; #执行两个步骤
Query OK, rows affected (0.000 sec)
MariaDB [testdb]> select * from students;
…….
| | 金星 | | 180.00 | 中性 | | |
+---+--------------+------+--------+--------+--------+-----------+
#在没有结束事务之前结束任务,前面执行的两个步骤都是失败的:
MariaDB [testdb]> exit
Bye
[root@localhost ~]# mysql -uroot -p123;
MariaDB [(none)]> use testdb;
MariaDB [testdb]> select * from students;
| | 静香 | | 170.00 | 女 | | |
| | 郭靖 | | 167.00 | 男 | | |
+---+--------------+------+---------+-------+--------+-----------+
#注意: truncate执行命令是对硬盘数据进行删除,无法回滚

MariaDB端口:3306。

4. 索引

  索引主要用于快速查询。但如果遇到增删改,索引又变得鸡肋。主键默认有索引的功能,因此不必为主键创建索引

4.1 创建索引

  方式1:创建表时创建索引,如:

MariaDB [testdb]> create table create_index(
-> id int primary key,
-> name varchar() unique,
-> age int,
-> key (age)
-> );

  方式2:对于已创建的表,添加索引

  如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致;

  字段类型如果不是字符串,可以不填写长度部分

  格式:create index 索引名称 on 表名(字段名称(长度)),如

    create index age_index on create_index(age);

4.2  查看索引

MariaDB [testdb]> show create table create_index;
……..
| create_index | CREATE TABLE `create_index` (
`id` int() NOT NULL,
`name` varchar() DEFAULT NULL,
`age` int() DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`),
KEY `age` (`age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
……….

4.3 删除索引

  格式: drop index 索引名称 on 表名;

MariaDB [testdb]> drop index age on create_index;
MariaDB [testdb]> show create table create_index;
……..
| create_index | CREATE TABLE `create_index` (
`id` int() NOT NULL,
`name` varchar() DEFAULT NULL,
`age` int() DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

4.4 测试时间

打开sql语句执行时间:set profiling=1

  关闭sql语句执行时间:set profiling=0

  查看sql执行时间:show profiles

5. 外键

5.1 概述

  外键是一种约束。如果一个实体的某个字段指向另一个实体的主键,就称为外键。被指向的实体,称之为主实体(主表),也叫父实体(父表)。负责指向的实体,称之为从实体(从表),也叫子实体(子表)

  对关系字段进行约束,当为从表中的关系字段填写值时,会到关联的主表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失败并报错。

5.2  查看外键

show create tables 表名

5.3 添加外键

如:alter table students add constraint fk_students_gid foreign key (gid) references grade(gid) on delete cascade;    on deleate cascade 允许级联删除

#给students的cls_id设置外键fkey,参考classes表的id
MariaDB [testdb]> alter table students add constraint fkey foreign key (cls_id) references classes(id);
ERROR (): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`#sql-50a_d`, CONSTRAINT `fkey` FOREIGN KEY (`cls_id`) REFERENCES `classes` (`id`))
#此处报错并不是语法错误,而是因为students.csl_id有1、2、3、4、5,而classes.id只有1、2,无法一一对应,为完成实验,删除students.csl_id为3、4、5的数据
MariaDB [testdb]> delete from students where cls_id>;
Query OK, rows affected (0.001 sec)
MariaDB [testdb]> alter table students add constraint fkey foreign key (cls_id) references classes(id);
Query OK, rows affected (0.046 sec)
Records: Duplicates: Warnings:
#测试外键:外键对应id只有1、2,因此无法插入cls_id 为大于2的数据
MariaDB [testdb]> insert into students values (,'小明',,180.2,,,);
Query OK, row affected (0.001 sec)
MariaDB [testdb]> insert into students values (,'小明',,180.2,,,);
ERROR (): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`students`, CONSTRAINT `fkey` FOREIGN KEY (`cls_id`) REFERENCES `classes` (`id`)) #外键约束classes表和students表有联系即classes表下有students表,因为设置外键后并没有允许级联删除,因此无法删除
MariaDB [testdb]> delete from classes where id=;
ERROR (): Cannot delete or update a parent row: a foreign key constraint fails (`testdb`.`students`, CONSTRAINT `fkey` FOREIGN KEY (`cls_id`) REFERENCES `classes` (`id`))
MariaDB [testdb]> delete from classes where id=;
ERROR (): Cannot delete or update a parent row: a foreign key constraint fails (`testdb`.`students`, CONSTRAINT `fkey` FOREIGN KEY (`cls_id`) REFERENCES `classes` (`id`))
MariaDB [testdb]> 

5.4 删除外键

不知道设置的外键名可以用show create table 查看表名,含有外键信息;

 格式:alter table 表名 drop foreign key 外键名

MariaDB [testdb]> show create table students;
CONSTRAINT `fkey` FOREIGN KEY (`cls_id`) REFERENCES `classes` (`id`)
MariaDB [testdb]> alter table students drop foreign key fkey;
Query OK, rows affected (0.002 sec)
Records: Duplicates: Warnings:
MariaDB [testdb]> show create table students;

5.5 级联删除

#设置外键允许级联删除
MariaDB [testdb]> alter table students add constraint fkey1 foreign key(cls_id) references classes(id) on delete cascade;
MariaDB [testdb]> select * from students order by cls_id; #按班分类
+----+-------------+------+-------+---------+------+----------+
| id | name | age | high | gender |cls_id|is_delete |
+----+-------------+------+-------+---------+------+----------+
| | 小明 | | 180.0 | 男 | | |
| | 彭于晏 | | 185.00 | 男 | | |
| | 黄蓉 | | 160.00 | 女 | | |
| | 周杰伦儿 | | NULL | 男 | | |
| | 王祖贤 | | 170.00 | 女 | | |
| | 和珅 | | 166.00 | 男 | | |
| | 程坤 | | 181.00 | 男 | | |
| | 凤姐 | | 150.00 | 保密 | | |
| | 刘德华 | | 175.00 | 男 | | |
| | 小月月 | | 180.00 | 男 | | |
| | 小明 | | 180.20 | 女 | | |
+----+-------------+------+--------+--------+-------+---------+
rows in set (0.000 sec)
#现在可以删除classes的数据了
MariaDB [testdb]> delete from classes where id=;
Query OK, row affected (0.001 sec)
MariaDB [testdb]> select * from students;
+----+----------+------+--------+--------+-------+----------+
| id | name | age | high | gender | cls_id| is_delete|
+----+----------+------+--------+--------+-------+----------+
| | 小月月 | | 180.00 | 男 | | |
| | 刘德华 | | 175.00 | 男 | | |
| | 凤姐 | | 150.00 | 保密 | | |
| | 程坤 | | 181.00 | 男 | | |
| | 和珅 | | 166.00 | 男 | | |
| | 小明 | | 180.20 | 女 | | |
+----+----------+------+--------+--------+-------+----------+

MariaDB数据库(四)的更多相关文章

  1. MariaDB数据库主从复制实现步骤

    一.MariaDB简介 MariaDB数据库的主从复制方案,是其自带的功能,并且主从复制并不是复制磁盘上的数据库文件,而是通过binlog日志复制到需要同步的从服务器上. MariaDB数据库支持单向 ...

  2. MySQL/MariaDB数据库的复制监控和维护

      MySQL/MariaDB数据库的复制监控和维护 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.清理日志 1>.删除指定日志文件名称之前的日志(也可用基于时间) M ...

  3. MySQL/MariaDB数据库的主从级联复制

      MySQL/MariaDB数据库的主从级联复制 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.主从复制类型概述 1>.主从复制 博主推荐阅读: https://ww ...

  4. MySQL/MariaDB数据库的主从复制

     MySQL/MariaDB数据库的主从复制  作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL复制概述 1>.传统扩展方式 垂直扩展(也叫向上扩展,Sacle ...

  5. MySQL/MariaDB数据库的mysqldump工具备份还原实战

    MySQL/MariaDB数据库的mysqldump工具备份还原实战 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.mysqldump概述 1>.逻辑备份工具 mysq ...

  6. MySQL/MariaDB数据库的各种日志管理

    MySQL/MariaDB数据库的各种日志管理 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.事务日志 (transaction log) 1>.Innodb事务日志相 ...

  7. MySQL/MariaDB数据库的事务和隔离级别

      MySQL/MariaDB数据库的事务和隔离级别 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.事务概述 1>.事务Transactions 一组原子性的SQL语句 ...

  8. MySQL/MariaDB数据库的并发控制

    MySQL/MariaDB数据库的并发控制 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.并发控制概述 1>.什么是并发控制 MySQL是一个服务器级别的数据库,它通常 ...

  9. MySQL/MariaDB数据库的索引工作原理和优化

    MySQL/MariaDB数据库的索引工作原理和优化 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 实际工作中索引这个技术是影响服务器性能一个非常重要的指标,因此我们得花时间去了 ...

  10. MySQL/MariaDB数据库的查询缓存优化

    MySQL/MariaDB数据库的查询缓存优化 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL架构 Connectors(MySQL对外提供的交互接口,API): ...

随机推荐

  1. EasyUI/TopJUI可编辑表格的列根据返回数据判断是使用 combobox 还是 numberbox

    这两天研究了一下topjui的可编辑表格edatagrid,想在每一列的后面根据返回的数据判断是使用 combobox 还是 numberbox,期间遇到了一些坑,下面实现代码,需要的朋友可以参考一下 ...

  2. C# string.Compare()

    tring.Compare方法,用来比较2个字符串值得大小 string.Compare(str1, str2, true); 返回值: 1 : str1大于str2 0 : str1等于str2 - ...

  3. 洛谷P2473||bzoj1076 [SCOI2008]奖励关

    https://www.luogu.org/problemnew/show/P2473 https://www.lydsy.com/JudgeOnline/problem.php?id=1076 不会 ...

  4. python之生成器(~函数,列表推导式,生成器表达式)

    一.生成器 概念:生成器的是实质就是迭代器 1.生成器的贴点和迭代器一样,取值方式也和迭代器一样. 2.生成器一般由生成器函数或者声称其表达式来创建,生成器其实就是手写的迭代器. 3.在python中 ...

  5. python入门之三元运算,存址方式,深浅拷贝

    三元运算 格式: name = 值1 if 条件 else 值2 如果条件为True,那么将值1赋值给name,条件为False,那么将值2赋值给name 存址方式 不同的数据类型在内存中的存址方式不 ...

  6. C8051F_CAN

    CAN总线特点:基于报文编码而非对节点编码,增删节点对系统没有影响,靠干扰稳定性好,速率高. 小工具:CANtool 收发器:CAN总线收发器CTM1050,通信速率1Mbps,至少可连接110个节点 ...

  7. winfrom项目的打印

    自己可以下一个PDF打印机(例如下载64位office虚拟打印文档) 首先要添加控件 1.添加打印的选项卡,并命名为打印 2.点击打印选项卡,右击鼠标,选择选择项 using System;using ...

  8. Java编程简介

    作者:CHAITANYA SINGH 来源:https://www.koofun.com//pro/kfpostsdetail?kfpostsid=3 JAVA由Sun Microsystems In ...

  9. ps 进程管理

    一. 进程管理 1. pstree 2. ps 3. top 4. nice 5. free 6. screen 二. 程序与进程 程序是静态的文件,进程是动态运行的程序. 三. 进程和线程 一个程序 ...

  10. 访问者模式和php实现

    访问者模式: 表示作用于某个对象结构中的各个元素的操作.它使你可以在不改变各个元素类的前提下定义作用于这些元素的操作. 角色: 1)抽象访问者:为该对象结构中具体元素角色声明一个访问操作接口.该操作接 ...