mysql学习3外键、事务和索引
程序员文章站
2022-06-01 09:13:36
...
外键
column 列
作用:
表之间联系的标识。
语法:
foreign key(col) references other_tn(o_col);
例:
foreign key(id) references user(id);
把自己的id和user表的id关联起来,注意,在哪一个设置外键,可以理解这个表是从属于那个表的。
限制条件:
外键列的类型要和对方主键列类型保持一致
外键列中的值必须是对方主键列中值的子集
插入数据先插入主表
删除数据先删除从表
分类:
一对一:
就是表与表之间对应的数据是唯一的,就像丈夫表和妻子表,彼此之间只能对应一个。
一对多:
表与表的数据可以对应多个,比如说买家表和订单表,一个买家可以有多个订单,但是一个订单只能有一个买家。
多对多:
表与表之间可以多对多,比如说学生表和选课表,一个学生可以选多个课程,而一个课程又可以被多个学生选择。这个时候借助第三方表来实现。
事务
原因 :
有些操作,要么全部执行,要不全部回退,这样的操作构成了事务,比如银行转账,要么转成功,要么转失败,但是钱的数量不能变。
开启事务:
begin或start transaction
结束事务:提交事务
commit:语句执行,如果遇到错误,回复到错误之前的状态(称为数据回滚)
rollback:手动回滚,自己控制的
特性:
Atomicity(原子性):事务是最小的不可分割的单位
Consistency(一致性):事务的前后,数据的状态前后是一致的,也就是说前后的数据量不改变
Isolation(隔离性):事务之间相互独立,互不影响
Durability(持久性):事务一旦提交,就永久的保存到数据库中
事务的并发问题
脏读:
事务A读取事务B中的数据,但事务B回滚了或再次更新了数据,称事务A读取到的数据为脏数据,注意,这时的事务B未提交
不可重复读:
事务A多次读取到的数据的过程中,事务B更新了次数据并提交了事务,称之为不可重复度,注意:提交了事务
幻影读:
事务A多次读取一张表额过程,数据的数量不一致,称之为幻影读。
更新丢失:
在对数据更新的过程中,多个事务对同一个操作时,后操作的会覆盖前面操作的。
几种问题的区别:
脏读和不可重复度的区别:脏读是事务B未提交事务,而不可重复读,是提交了事务
幻影读和脏读的区别:幻影读是数据额数量改变了,也就是对数据进行添加或者删除,而脏读金额不可重复读,是数据不一致,而本身的数量没有改变。
处理
事件隔离级别 | 脏读 | 不可重复度 | 幻影读 |
---|---|---|---|
读未提交(read uncommitted) | Y | Y | Y |
读提交(read committed) | N | Y | Y |
可重复度(repeatable read) | N | N | Y |
串行化(serializable) | N | N | N |
设置隔离级别:
set session transaction isolation level 隔离级别
查看隔离级别:
select @@tx_isolation;
隔离级别逐渐增加,但是并发效率逐渐降低。
锁
作用:
为了解决数据更新丢失问题
方法:
为每个事务加个锁,使每次都只能执行一个事务,也就是在同等时间内,只能有一个事务对这个数据进行处理。
种类:
悲观锁 在select后面加for update,行级锁,排他锁
乐观锁 在数据后面加一列version用来记录修改的次数。每次都比较version,来确定是不是已经修改过了
注意:
在查询后面加for update,相当于告诉其他事务,我在使用这个记录。
索引
索引的作用:
提高查找效率
应用:
表中的主键列和外键列和唯一列默认有索引
语法:
index 索引名(列名)
例:
单索引:
create table user(id int primary key,name varchar(20),index name_in(name))
给name加上索引
多索引:
create table user(id int primary key ,name varchar(20),age int,index l_index(name,age))
以name和age为索引,在同时查找这两个的时候,会加快查询速度,但是当只查询一个的时候,不提高查找速度。
删除索引:
drop index 索引名 on 表名;
查看索引:
show index from 表名;
索引特性:
对查询速度有增益
但是会有额外的索引维护的消耗
索引不是越多越好,会浪费内存
SQL分类
数据查询语言DQL(Data Query Language):select、where、order by、group by、having。
数据定义语言DDL(Data Definition Language):create、alter、drop。
数据操作语言DML(DataManipulation Language):insert、update、delete 。
事务处理语言TPL(Transaction Process Language):commit、rollback 。
数据控制语言DCL(Data Control Language):grant、revoke。