
事务
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务
事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行
事务用来管理insert,update,delete语句
一般来说,事务是必须满足4个条件(ACID): Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)
1、事务的原子性:一组事务,要么成功;要么撤回;
所做的操作,要么成功,要么撤回。
2、稳定性 : 有非法数据(外键约束之类),事务撤回。
比如说:两个关联的表,当你删除时,是要将两个表关联的数据都删除,可是当你操作后只删除其中一个表的数据,数据库就卡死了,导致没有完全删除,就会撤回。
3、隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
4、可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit选项 决定什么时候吧事务保存到日志里
当执行命令到一半时就宕机了,因为宕机也无法撤回,但是当重启后会查看日志,根据日志进行撤回。
- 在Mysql控制台使用事务来操作
begin; #开始一个事务
insert into a (a) values(555);
rollback; 回滚 , 这样数据是不会写入的
commit; 提交,提交之后就不能撤回了。
查看A表中的数据
mysql> begin;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into A (a) values (6);
Query OK, 1 row affected (0.00 sec)
mysql>
mysql> insert into A (a) values (7);
Query OK, 1 row affected (0.00 sec)
mysql> select * from A;
+---+
| a |
+---+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
+---+
7 rows in set (0.00 sec)
#查看当前A表的内容,数据已经成功的插入。
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> select * from A;
+---+
| a |
+---+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+---+
5 rows in set (0.00 sec)
#使用回滚后,就恢复了插入数据之前的数据内容。
mysql> insert into A (a) values (6);
Query OK, 1 row affected (0.02 sec)
mysql>
mysql> insert into A (a) values (7);
Query OK, 1 row affected (0.02 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from A;
+---+
| a |
+---+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
+---+
7 rows in set (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from A;
+---+
| a |
+---+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
+---+
7 rows in set (0.01 sec)
#commit提交以后,就无法再回滚了
索引
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。
索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。
创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
上面都在说使用索引的好处,但过多的使用索引将会造成滥用。
因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。
show index from student;#查看student表的索引
默认表的主键就是索引
索引操作
创建索引
create index index_name on student (name(32));
#创建索引,索引名温蒂index_name;
#on student (name(32)):是针对student这个表来创建索引,引用student的name字段来创建索引,索引hash长度不能超过32(这个长度一般建议使用与字段相同的长度)
可以看到新创建的索引
- 创建表指定索引
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX [indexName] (username(length))
);
- 删除索引
drop index index_name on student;
- 唯一索引
它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
比如主键就可以当做唯一索引,因为主键的值是唯一的。
create unique index index_name on student (id);
#通过id建立唯一索引; 不要使用name等会出现重复值的字段来建立唯一索引。
Mysql Python交互
python-mysqldb
- python-mysqldb安装
python-mysqldb最后更新时间位2014年,且不能被python3所支持,可以不学习mysqldb。
不过mysqldb与pymysql的操作命令几乎一样。
linux:
yum install MySQL-python
window:
http://files.cnblogs.com/files/wupeiqi/py-mysql-win.zip
pymysql
http://www.cnblogs.com/wupeiqi/articles/5713330.html
参考
- 下载安装
pip3 install pymysql
- 使用操作
#授权
grant all on *.* to 'root'@'%' identified by '123qwe';
'''我们通过root进入mysql,然后给root授权,所有源都可以登录(除本地)'''
#更新配置
flush privileges;
#在centos7中关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl mask firewalld.service
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#示例
import pymysql
# 创建连接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
# 创建游标
cursor = conn.cursor()
'游标就是MySQL中的:"mysql>" 位置'
# 执行SQL,并返回收影响行数
effect_row = cursor.execute("update hosts set host = '1.1.1.2'")
# 执行SQL,并返回受影响行数
#effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,))
# 执行SQL,并返回受影响行数
#effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
# 提交,不然无法保存新建或者修改的数据
conn.commit()
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
#在pycharm中执行代码来连接linux
import pymysql
# 创建连接
conn = pymysql.connect(host='192.168.2.202', port=3306, user='aubrey', passwd='123qwe', db='test')
# 创建游标
cursor = conn.cursor()
'''游标就是MySQL中的:"mysql>" 光标位置'''
'''相当于创建一个实例'''
# 执行SQL,并返回收影响行数
effect_row = cursor.execute("select * from student")
#读取数据
print (cursor.fetchone())
'''cursor.fetchone读取一条数据,'''
print (cursor.fetchone())
'''cursor.fetchone接着上一条数据,再往下读取一条数据,'''
执行结果
import pymysql
# 创建连接
conn = pymysql.connect(host='192.168.2.202', port=3306, user='aubrey', passwd='123qwe', db='test')
# 创建游标
cursor = conn.cursor()
'''游标就是MySQL中的:"mysql>" 光标位置'''
'''相当于创建一个实例'''
# 执行SQL,并返回收影响行数
effect_row = cursor.execute("select * from student")
#读取数据
# print (cursor.fetchone())
# '''cursor.fetchone读取一条数据,'''
# print (cursor.fetchone())
# '''cursor.fetchone接着上一条数据,再往下读取一条数据,'''
print ('----------------------------')
print (cursor.fetchall())
'''读取所有数据'''
print (cursor.fetchmany())
'''获取多条数据'''
- 插入数据
drop table study_record;
'''因为之前student表被关联了study_record表,导致不能修改student表,所以这里删除study_record表'''
alter table student modify id int auto_increment;
'''让student表的id可以自增'''
这是当前student表的数据内容
import pymysql
# 创建连接
conn = pymysql.connect(host='192.168.2.202', port=3306, user='aubrey', passwd='123qwe', db='test')
# 创建游标
cursor = conn.cursor()
'''游标就是MySQL中的:"mysql>" 光标位置'''
'''相当于创建一个实例'''
data = [
("N1","2015-05-22",'M'),
("N2","2015-05-21",'M'),
("N3","2015-05-23",'F')
]
#执行SQL,并返回受影响行数,执行多次
cursor.executemany("insert into student (name,register_date,new_money) values(%s,%s,%s)",data)
'''将data数据插入到student表中'''
conn.commit()
'''提交才能生效'''
成功插入数据到student表中