1.表与表的对应关系
- 一对一
- 一对多
- 多对一
- 多对多
2.约束
2.1作用
- 是一种限制,用于限制表中的数据,为了保证数据的准确性以及可靠性
2.2约束分类
- NOT NULL,非空,用于保证某个字段不为空。支持列级约束。
- DEFAULT,默认,用于保证某个字段具有默认值。支持列级约束。
- PRIMARY KEY,主键,用于保证某个字段具有唯一性且非空。支持列级约束以及表级约束。
- UNIQUE,唯一,用于保证某个字段具有唯一性。支持列级约束以及表级约束。
- FORGIEN KEY,外键,用于限制两个表间的关系。支持表级约束。
注: - 列级约束:指的是定义列的同时指定的约束
- 表级约束:指的是列定义之后指定的约束。
- 外键常用于一对多的关系。即表的某条数据,对应另外一张表的多条数据。
- 将 “一” 的一方称为 :主表。
- 将 “多” 的一方称为 :从表。
- 通常将 外键 置于从表上,即从表上增加一列作为外键,并依赖于主表的某列。
3.锁
3.1 根据锁的粒度分:行锁与表锁
表级锁
只有当前用户可以操作整张表,其他请求排队等候,等待当前sql操作执行完毕
特点:开销小,加锁快,不会出现死锁,锁定粒度大,发生锁冲突的概率高,并发性极差,一致性极好
行级锁
只有当前用户可以操作该行记录,其他请求排队等候,等待当前sql操作执行完毕。
特点:开销大,加锁慢,会出现死锁,锁定力度小,发生锁冲突的概率低,并发性高
页面锁
开销时间、加锁时间、锁定粒度在表级锁与行级锁之间,会出现死锁,并发度中等
3.2根据数据库系统分:读锁和写锁
读锁:
其他请求可读不可写(共享锁),用于不更改或不更新数据的操作(只读操作)
select * from [table] lock in share mode;
写锁:
其他请求不可读不可写(排他锁),用于数据修改操作,确保不会同时同一资源进行多重更新
select * from [table] for update;
注:select…for update语句在执行中所有扫描过的行都会被锁上,因此在mysql中用悲观锁,务必确定走了索引,而不是全表扫描,否则将会把数据表锁住
3.3引擎对比myisam与innodb
MyISAM在执行查询语句前,会自动给涉及的所有表加读锁,在执行更新操作前,会自动给涉及的表加写锁