触发器
触发器是特殊的存储过程(一段能产生特定影响的sql语句),它没有参数,相比于sql约束(像非空约束,唯一约束,check约束)
触发器能完成更复杂的约束。
创建触发器
1
2
3
4
5
create trigger 触发器名
after|before update|insert|delete on 联系表名 for each row
begin
触发体
end
例如:
1
2
3
4
create trigger delete_trigger
after delete on department for each row
insert into merch_log(who, oper_date)
values(user(), sysdate());
删除触发器
1
drop trigger 触发器名;
触发器性质
for each row
任何一条记录上的操作满足触发事件都会激活该触发器,毫无疑问触发器对联系表具有访问权,
同时MySQL定义了new表和old表,new表是update或insert之后的联系表,old表是delete或update之前的联系表,
触发器对这两个表也具有访问权限。
数据库索引
1.索引是为了加快查询效率的一种数据结构,例如主键会自动加上唯一索引以加快查询效率(比如我们通常以主键为条件select) 2.唯一索引
- 任何与null比较的返回值都是null,包括null与null比较,但是带唯一约束的字段可以为null,但不能存在两个null,因为唯一约束规定null和null相同
2.外键
- 为了保证数据的一致性和正确性,我们往往会使用外键。例如1,在级联更新下,学生表中stu_id是主键,成绩表中stu_id是外键,如果在主表中stu_id发生变化,那么为了保证一致性从表中也会更新;例如2,当我们向成绩表中插入数据时,为了保证正确性会检查stu_id在学生表中是否存在,如果不存在则会插入失败;
- 添加外键索引
- 创建成绩表时添加:
foreign key(stu_id) references t_student(stu_id)
; - 创建表后才添加:
ALTER TABLE t_score add constraint "t_score_fk1" foreign key(stu_id) references t_student(stu_id)
;
- 创建成绩表时添加:
- 外键的优点
- 保证了数据库数据的一致性和完整性;
- 级联操作方便,减轻了程序代码量;
- 外键的缺点
- 外键影响数据库的插入速度;
- 级联更新是强阻塞,存在数据库更新风暴的风险;
- 使用外键存在的问题
- 外键的主从关系是定的,但是需求确实变化的,如果字段不在需要与其他表关联就会增加麻烦;
- 由于外键约束的存在,每次做级联更新和删除时都需要仔细考虑后果;
- 外键还会因为需要请求对其他表内部加锁而容易出现死锁情况;
- 对分库分表不友好 :因为分库分表下外键是无法生效的;
- 外键的适用场景:外键与级联更新适用于单机低并发,不适合分布式、高并发集群;
数据库设计
1.三大范式
- 第一范式:字段不可再分
- 第二范式:在第一范式的基础上,所有非主属性完全依赖主键
- 第三范式:在第二范式的基础上,所有非主属性直接依赖主键
2.ER图:实体关系图,适用它可以清楚的表示实体之间的关系,例如:由角色,和权限两种实体,其中一个角色可以拥有多条权限,而一条权限可以被不同的角色拥有,因此角色和权限之间是多对多的关系,另外还有一对一,一对多等关系
- 正方形表示实体
- 菱形表示关系实体
- 圆形表示实体属性
3.字符集
- 不同字符集能表示的字符范围不同,存储字符使用的字节数也不同
- Unicode 字符集是如今使用最多的一种字符集,它有多种编码实现,其中包括utf-8、utf-16、utf-32。
- 在数据库中对于utf-8有两套实现,分别是utf-8、utfmb4。而utfmb4能表示的字符范围更广、可以表示emoji字符以及一些复杂的汉字。
- 如果往CHARSET=utf-8的数据库中存入emoji字符会报错,因此应该使用utfmb4字符集。
数据库事务
1.事务ACID特性: 以MySQL的InnoDB存储引擎为例
- A:原子性(atom),即以事务为最小单位,事务内的所有操作要么都成功要么都失败;依靠回滚日志(undo log)实现
- I:隔离性(Isolation),并发事务不会互相影响;依靠锁机制和MVCC实现
- D:持久性(durable),事务执行成功后对数据产生的影响是持久的,及时数据库发生故障,影响依然存在;依靠重做日志(redo log)实现
- C:一致性(consistency),即事务执行前后,数据依然保持逻辑一致性,这个逻辑一致性一般符合现实逻辑,或由DBA指定的规则;上述三者实现后,一致性才能实现
2.事务并发产生的响应
- 幻读和不可重复读的区别:不可重复读在于对同一条记录进行多次查询时发现某些列被改变,而幻读在于多次查询时发现记录增加或者减少了,而实际查询得到的结果又不同(由于可重复读生效,导致每次读到的结果与第一次读到的结果相同)。
3.MySQL的默认事务隔离级别
- 命令行查看方式
select @@tx_isolation;
- InnoDB默认隔离级别是repeatable-read,需要应用加锁读实现,这个加锁实现依靠的就是next-key Locks(兼具记录锁和间隙锁的特点,既锁行又锁范围)
- InnoDB 存储引擎在分布式事务的情况下一般会用到 SERIALIZABLE(可串行化) 隔离级别。
数据持久化
1.什么叫做持久化:把数据存入可掉电式存储设备中以供后续使用;而持久化的过程大多通过关系型数据库完成
2.数据库存取技术之JDBC:是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口;而JDBC和数据库驱动的关系其实就是接口和实现类的关系;
3.对于Java程序来说如果没有JDBC程序会怎么样:与不同的数据库管理系统进行连接的时候,每针对一个数据库管理系统我们就需要写一套实现;显然对开发做出了很高的要求,不利于开发效率,而有了JDBC的存在,我们就只需要写一套实现就OK了,其实有点类似于工厂方法,JDBC就像抽象工厂用于涉及一整套连接数据库的规范,而针对不同的数据库的工厂实现类(数据库驱动)就由数据库开发商开发
4.使用JDBC实现数据库连接的具体实现流程是怎样的?
5.JDBC URL:如jdbc:mysql://localhost:3306,注意jdbc称为协议名,mysql称为子协议名主要用于表示数据库驱动,后面的称为子名称主要用于定位数据库,整个URL主要提供给驱动器管理器DriverManager选择正确的数据库驱动;跟Http协议比起来它并不是传输数据的协议
6.注册数据库驱动这一步骤主要干了什么?在一个项目中有可能会使用多种数据库系统,而这一步就是将这些数据库对象的数据库驱动信息保存在一个数组里,但获取连接时会用URL去这个数组进行一一比对,以获取到正确的数据库驱动程序去连接对应的数据库
7.jpa和jdbc的区别:jpa是orm规范,orm旨在通过操作实体类就能直接操作数据表,尽量避免大量的SQL语句的编写;jdbc是Java程序访问数据库的统一规范;jpa的实现底层还是要借助jdbc的,毕竟还是要和数据库交互,只不过如果使用jpa我们就不用去管怎么去编写具体的SQL语句,不用关心怎么将关系字段与对象属性一一对应;