zoukankan      html  css  js  c++  java
  • 数据库索引备份外键和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()
    
    
    
    
  • 相关阅读:
    冲突域和广播域的区分
    internet 的一词多义
    大神洗礼第四讲——函数相关及编程技巧
    旋转字符串算法由浅入深
    一个交换程序的通用版本
    想起一些事情,都很遥远
    [转载]创业感想
    [转载]javascript小技巧
    [转载]在Asp.Net 2.0中应用DataFormatString
    [转载]C#的String.Format格式化举例
  • 原文地址:https://www.cnblogs.com/-min/p/12833251.html
Copyright © 2011-2022 走看看