数据库索引备份外键和pymysql

1、数据控制

1)事务

​ 事务把一组操作看成是一个整体,要么都操作成功,要么就都操作失败

​ 数据库的引擎:引擎是驱动数据库系统工作的核心,MySQL数据库常见的引擎有,myisam,innodb,archive,ndb,memory等

​ 表的数据引擎操作是innodb,innodb可以支持事务,myisam不支持事务

​ 修改表的引擎:alter table 表名 engine=innodb;

	提交:
	mysql数据库默认的提交事务是自动提交,我们写的sql语句一旦执行产生的数据就会直接被提交数据库保存,如果不是自动提交产生的数据首先会在内存的缓存区域保存,然后我们手动的提交以后才能把数据存入数据库表。
	查询是否是自动提交:
	select @@autocommit; #如果为0则是手动 为1则是自动
	设置自动提交方式
	set autocommit=0 ;# 为0关闭自动变成手动,为1则开启自动
	需要自己输入 commit;
	
	回滚:在提交手动的情况下,撤回缓存中的数据。
	在内存的缓存区域操作,我们执行了sql语句产生的数据首先存入内存的缓存区,我们可以通过回滚将本次操作产生的数据从缓存中撤回(在提交之前,如果已经提交则无法撤回)
	rollback;
2)授权管理

创建用户

	#创建一个用户
	create user '用户名'@'服务器地址' identified by '密码';
	#删除用户
	drop user '用户名'@'服务器地址';

修改密码

	# 修改当前用户密码
	set password=password('123456');
	# 修改其他用户密码
	set password for '用户名'@'服务器' = password('123456');
	#刷新 
	flush privileges;

授权

	grant 权限 on 数据库.表 to '用户名'@'服务器'
	grant select on jiaowudb.student to 'bobo'@'%'; 
	grant all on *.* to 'bobo'@'%';
	注意: %代表服务器为本地,all代表所有权限,*.*代表所有的表
	权限包括:select,insert,update,alter,drop等

回收权限

在本地服务器上回收用户老王的查找权限

revoke select on testdb.test from ‘laowang’@’%’;

2、外键

1)外键设置

​ 如果表A的主关键字是表B的一个字段,则称该字段为表B的外键,此时表A为主表,表B为表A的从表。

要设置外键:

​ 1)数据库表的引擎必须是innodb

​ 2)主表和从表相关的外键字段类型必须兼容,最好一致

​ 3)外键的取值:要么为空,要么从主表的主键中取

	# 添加外键
	ALTER TABLE 表名 				#此表名是从表的名,外键名称:fk_从表名_主表名_字段名
	ADD CONSTRAINT 外键名称 FOREIGN KEY (从表的外键列字段) REFERENCES 主表名 (主键列字段)
	[ON DELETE reference_option]
	[ON UPDATE reference_option];
	reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION
	
	# 删除外键
	ALTER TABLE 从表 DROP FOREIGN KEY 外键名;
	
	
	
	1)CASCADE:从父表中删除或者更新对应的行,同时自动会删除或者更新子表中匹配的行
	2)NO ACTION:Innodb拒绝删除或者更新付表
	3)SET NULL:从父表中删除或者更新对应的行,同时会把子表中的对应行的外键置空注意,这些在外键列没有被设为NOT NULL时才有效。ON DELETE SET NULL和ON UPDATE SET SET NULL都被InnoDB所支持。
	4)RESTRICT:拒绝删除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的。
	

2)关系表的对应

​ 1)一对一

​ 表A中的每一条记录在表B中有且只有一条和它对应

​ 表A可以是表B主表,表B也可以是表A的主表。

​ 2)一对多

​ 表A中每一条记录在表B中可以有多条记录和它对应

​ 表A作为主表,表B作为表A从表

​ 3)多对多

​ 表A中的每一条记录在表B中有多条和它对应,表B中的每一条记录在表A中也可以有多条和它对应

多对多的关系需要一个关系表C来体现

​ C既做A的从表,又做B的从表,联系AB

	案例:金庸武侠中有三个实体,人物、技能、派别;
		1)创建三张表
		create table renwu(rid int primary key auto_increment,name varchar(10),sex enum('男','女'),level varchar(10));
		create table jineng(jid int primary key auto_increment,name varchar(10),level int,cd int);
		create table paibie(pid int primary key auto_increment,name varchar(10),address varchar(100),kouhao varchar(100));
		2)确立关系
		画E-R图,再建立关系
		rewu和派别是多对一,人物和技能是多对多
		人物和派别的关系,是一对多:
		分析:人物是多,派别是一,即派别是人物的主表,人物是从表
		alter table renwu add paibie_id int; #
		alter table renwu add constraint paibie_id foreign key (paibie_id) references paibie (pid);
		人物和技能的关系,多对多:
		多对多关系需要先创建一个关系表:
		create table renji(id int primary key auto_increment,renwu_id int,jineng_id int,score float);
		然后确立renji表示人物和技能的从表
		alter table renji add constraint renwu_id foreign key (renwu_id) references renwu (rid);
		 alter table renji add constraint jineng_id foreign key (jineng_id) references jineng (jid);
		 
		 注意:一对一关系:A和B只需要把A的主键设置为B外键即可

3、索引视图

1)索引

​ 索引就相当于图书的目录,可以加速查询,一般在where,order by,group by, having后的字段建立索引。

​ 索引的优点:

加速检索速度,唯一索引保证数据的唯一性,降低分组、排序的时间,可以使用查询优化器提高系统性能

​ 索引的缺点:

​ -建立索引会建立对应索引文件,占用大量空间

-建立索引会降低增、删、改的效率

​ 不建立索引的情况:

​ -频繁更新的字段不建议建索引,没有出现在where、having不建议建索引,数据量少的表没有必要建索引,唯一性比较差的字段不要建索引

​ 索引的分类:

​ 普通索引

	create index 索引名 on 表名(字段 asc/desc); # 默认是asc 升序  #索引名格式 index_字段名

​ 唯一索引

	# 在唯一索引所在的列不能有重复值,增加和修改会受影响
	create unique index 索引名 on 表名(字段 asc/desc);

​ 主键索引

创建表,主键索引会自动添加,要求在主键上不能有重复值和空值

​ 复合索引(联合索引) 索引了多个列

create   index 索引名 on 表名(字段 asc/desc) 默认asc升序 
					索引名index_字段名1_字段名2
					使用联合索引 ,必须包含左前缀
						a
						a,b  a,c
						a,b,c

​ 全文索引

一般会用全文索引服务器,不会直接创建索引
create  FULLTEXT index 索引名 on 表名(字段  asc/desc)

​ 删除索引

	drop index 索引名 on 表;

​ 查看索引(分析索引,sql语句执行效率)

	show index from 表;
	
	用explain关键字来查看是否使用了索引
	explain select * from jineng where name = '乾坤大挪移';
	+----+-------------+--------+------------+-------+--------------------+--------+---------+-------+------+----------+-------+
| id | select_type | table  | partitions | type  | possible_keys      | key    | key_len | ref   | rows | filtered | Extra |
+----+-------------+--------+------------+-------+--------------------+--------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | jineng | NULL       | const | name_2,j_name,name | name_2 | 303     | const |    1 |   100.00 | NULL  |
+----+-------------+--------+------------+-------+--------------------+--------+---------+-------+------+----------+-------+

	explain select * from jineng where level=80;
	+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table  | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | jineng | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    6 |    16.67 | Using where |
+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+
	type:
		all 	代表全表扫描
		index	使用索引
		range	在指定范围内查找
		const	常量查询

​ 其他创建索引的方式

​ alter table 表名 add index(字段1,字段2,…);

​ alter table 表名 add primary key(字段1,字段2,…);

​ alter table 表名 add unique(字段1,字段2,…);

​ alter table 表名 add fulltext(字段1,字段2,…);

​ 不使用索引的情况

  • - 查询时的联合索引没有左前缀,不使用索引
    - or条件里,如果一方字段没有索引,则不使用索引
    - 类型不对应的不会使用索引
    - like  '%tom' ,如果左边是通配符,不会使用索引
    - 使用!=、<>、not in操作,不使用索引
    

2)视图

​ 有时候经常会遇到复杂的查询,写起来比较麻烦,这个时候我们可以使用视图来简化查询。视图就是固化sql语句,可以不把视图看做基本表使用

	创建视图
	create view 视图名(字段列表) as select语句;
 	使用视图
   	select * from 视图名 where 条件
	删除视图
	drop view 视图名;
	查询视图的创建语句
	show create view 视图名;

4、数据库的备份与恢复

​ 备份

	不用登录MySQL,直接执行mysqldump指令,将数据库备份到指定的家目录下或者文件夹下
	mysqldump -uroot -p 数据库名 > ~/备份目录/备份文件名.sql;
备份所有数据库:
 mysqldump –u用户名 –p –h 主机名 --all-databases > 备份文件名.sql

​ 恢复

	首先要创建一个数据库,然后退出mysql,执行恢复指令
	mysql -uroot -p 数据库名 < ~/备份目录/备份文件名.sql;

图形化界面:sudo apt install -y mysql -workbench

5、pymysql

  • 安装pymysql

    pip install pymysql (在pycharm terminal)
    
    
  1. 连接数据库

    import pymysql
    link=pymysql.Connect(host='182.92.7.134',port=3306,user='min',password='123',database='yu1',charset='utf8')
    print(link)
    参数说明:
        host – 数据库服务器所在的主机,公网ip或域名本地 localhost。
        user – 登录用户名。
        password – 登录用户密码。
        database – 连接的数据库。
        port – 数据库开放的端口。(默认: 3306)
        charset – 连接字符集。
    返回值:
       返回连接对象
    
    • 连接对象方法
    方法 说明
    begin() 开启事务
    commit() 提交事务
    cursor(cursor=None) 创建一个游标用来执行sql语句
    rollback() 回滚事务
    close() 关闭连接
    select_db(db) 选择数据库
  2. 创建游标

    cursor = link.cursor()
    print(cursor.rowcount) #打印受影响行数
    
    
    方法 说明
    close() 关闭游标
    execute(query, args=None) 执行单条语句,传入需要执行的语句,是string类型;同时可以给查询传入参数,参数可以是tuple、list或dict。执行完成后,会返回执行语句的影响行数。
    fetchone() 取一条数据
    fetchmany(n) 取多条数据
    fetchall() 取所有数据
  3. 执行sql语句

    # 执行sql语句
    sql = 'select * from student(表名)'
    # 执行完sql语句,返回受影响的行数
    num = cursor.execute(sql)
    
    
  4. 获取结果集

    result1 = cursor.fetchone()
    print(result1)
    
    
  5. 关闭连接

    cursor.close()
    link.close()
    
    
    
  • 注意:

    写完代码后,需要将py文件添加可执行权限

    sudo chmod +x xxx.py
    ./xxx.py 
    
    
    

pymysql事务处理

pymysql默认是没有开启自动提交事务,所以我们如果进行增、删、改,就必须手动提交或回滚事务。

   sql = 'delete from student where 条件
   # 如果要执行增删改语句的时候,下面的就是固定格式
   try:
   		cursor.execute(sql)
   		# 如果全部执行成功,提交事务
   		link.commit()
   		print(cursor.lastrowid) #获取最后插入记录的自增id号
   except Exception as e:
   		print(e)
   		link.rollback()
   finally:
   		cursor.close()
   		link.close()



posted @ 2019-09-02 20:41  千亿  阅读(135)  评论(0编辑  收藏  举报