mysql学习3外键、事务和索引
外键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)YYY读提交read committed)NYY可重复度(repeatable read)NNY串行化(serializable)NNN设置隔离级别 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分类数据查询语言DQLData Query Languageselect、where、order by、group by、having。 数据定义语言DDLData Definition Languagecreate、alter、drop。 数据操作语言DMLDataManipulation Languageinsert、update、delete 。 事务处理语言TPLTransaction Process Languagecommit、rollback 。 数据控制语言DCLData Control Languagegrant、revoke。