MySQL的主键约束与事务

167 阅读3分钟

这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

1. 主键约束

主键约束可以分为2种: 单列主键约束:在一个列上添加的主键约束 复合主键约束:在两个或更多列上添加的主键约束。 即主键可以是1个列构成的,也可以是多个列构成的。 复合主键约束是用在多对多映射关系中,当两个表具有多对多映射关系时,就需要创建中间关系表,关系表中要用复合主键约束。  例如 stu_course表 -- 创建学生,课程关系表

-- 创建学生,课程关系表
CREATE  table stu_couse(
 cid  int ,
 sid  int,
 FOREIGN KEY(cid)  REFERENCES  course(cid),
  FOREIGN KEY(sid)  REFERENCES  stuinfo(stuid),
 PRIMARY key(cid,sid)  -- 同时在cid和sid上添加主键约束
)

复合主键约束的特点:添加了复合主键约束的任何一列的值可以重复,但是组合在一起就不能重复了。例如: image.png

设计表时添加主键约束:

image.png

2. 常见的映射关系

1)一对一:两个实体(表)之间的基数的比例为1:1.   例如:男女朋友是1:1,boy表和gril表。通过外键来确定2个表的一对一的映射关系。 在表设计时,外键添加在任何一张表上都行。

2)一对多/多对一:两个实体(表)之间的基数的比例为1:N.  例如班级和学生,球队和球员。站在一方角度来看是1对多,从多方角度来看就是多对一。在表设计,外键是添加在多方的表上。

3)多对多:两个实体(表)之间的基数的比例为M:N.其实就是2个一对多。  例如课程和学生,共享单车和骑行者。 在表设计时,要再创建一个中间关系表,在中间关系表中使用复合主键(同时也是外键)来反映多对多关系。

3.数据库事务

事务:一个或多个SQL语句组成的逻辑工作单元,这个单元中的一组操作要么全部执行成功,要么全部失败。 经典案例:转账,a和b之间进行转账交易,要么两方都成功,要么都失败。

事务的四个特性(ACID):

  • 原子性(A):事务中的多个SQL操作是一个不能分割的整体,要么都执行成功,要么都执行失败。

  • 一致性(C): 在事务执行前后数据状态是一致的。

  • 隔离性(I):多个事务同时操作相同数据库的同一个数据时,一个事务的执行不受另外一个事务的干扰,彼此隔离.

  • 持久性(D):事务一旦提交,对数据库的影响是永久的

  在MySQL中,任何一个或多个DML语句都构成了一个事务,事务默认是自动提交的,即事务默认是隐式事务

显式事务:有明显的开启和结束事务的标记. 显式事务的编写步骤:

1、开启事务

取消自动提交事务的功能

2、编写事务的一组逻辑操作单元(多条sql语句)

insert
update
delete

3、提交事务或回滚事务

示例代码:

--  显式事务

-- 取消事务自动提交功能

set autocommit=0;

-- 开启

start TRANSACTION;

 update  account set balance=balance-100  where id=1;

  update  account set balance=balance+100  where id=2;

-- 回滚

ROLLBACK;

并发事务产生的问题:

image.png

4,事务隔离级别

image.png

演示隔离级别:

1)设置隔离级别,此处设为read committed

image.png

2) 使用数据库

image.png

  1. 设置命令行界面的字符集为gbk

image.png

4) 开启事务,执行修改操作

image.png

5)上面的事务没有提交,则第2个事务就读不到脏数据(临时无效的数据),即避免了脏读。