触发器,指一段代码,当触发某个事件时,自动执行这些代码。
使用场景:
1、 可以通过数据库中的相关表实现级联更改。
2、 实时监控某张表中的某个字段的更改而需要做出相应的处理。
3、 例如可以生成某些业务的编号。
4、 注意不要滥用,否则会造成数据库及应用程序的维护困难。
MySQL中字段为什么要求定义为not null?
null值会占用更多的字节,并且null有很多坑的。
MySQL中一条SQL语句在MySQL中如何执行的?
1、 先检查该语句是否有权限
2、 如果没有权限,直接返回错误信息
3、 如果有权限,在MySQL8.0版本以前,会先查询缓存。
4、 如果没有缓存,分析器进行词法分析,提取sql语句select等的关键元素。然后判断sql语句是否有语法错误,比如关键词是否正确等等。
5、 优化器进行确定执行方案
6、 进行权限校验,如果没有权限就直接返回错误信息,如果有权限就会调用数据库引擎接口,返回执行结果。
MySQL中select for update有什么含义,会锁表还是锁行还是其他?
select for update是为了在查询时,避免其他用户以该表进行插入,修改或删除等操作,造成表的不一致性
给你举几个例子:
select * from t for update会等待行锁释放之后,返回查询结果。
select * from t for update nowait不等待行锁释放,提示锁冲突,不返回结果
select * from t for update wait 5等待5秒,若行锁仍未释放,则提示锁冲突,不返回结果
select * from t for update skip locked查询返回查询结果,但忽略有行锁的记录
分成两类:加锁范围子句和加锁行为子句
加锁范围子句:在select…for update之后,可以使用of子句选择对select的特定数据表进行加锁操作。默认情况下,不使用of子句表示在select所有的数据表中加锁
加锁行为子句:当我们进行for update的操作时,与普通select存在很大不同。一般select 是不需要考虑数据是否被锁定,最多根据多版本一致读的特性读取之前的版本。加入for update之后,Oracle就要求启动一个新事务,尝试对数据进行加锁。如果当前已经被加锁,默认的行为必然是block等待。使用nowait子句的作用就是避免进行等待,当发现请求加锁 资源被锁定未释放的时候,直接报错返回。
在日常中,我们对for update的使用还是比较普遍的,特别是在如pl/sql developer中手工修改数据。此时只是觉得方便,而对for update真正的含义缺乏理解。
For update是Oracle提供的手工提高锁级别和范围的特例语句。Oracle的锁机制是目前各类型数据库锁机制中比较优秀的。所以,Oracle认为一般不需要用户和应用直接进行锁的控制和提升。甚至认为死锁这类锁相关问题的出现场景,大都与手工提升锁有关。
所以,Oracle并不推荐使用for update作为日常开发使用。而且,在平时开发和运维中,使用了 for update却忘记提交,会引起很多锁表故障。那么,什么时候需要使用for update?就是那些需要业务层面数据独占时,可以考虑使用for updateo场景上,比如火车票订票,在屏幕上显示邮票,而真正进行出票时,需要重新确定一下这个数据没有被其他客户端修改。所以,在这个确认过程中,可以使用for update。这是统一的解决方案问题,需要前期有所准备。
MySQL 中 varchar (50)中 50 的涵义?
最多存放50个字符,varchar(50)和(200)存储hello所占空间一样,但后者在排序时会消耗更多内存,因为order by col采用fixed_length计算col长度(memory引擎也一样)。在早期MySQL版本中,50代表字节数,现在代表字符数。
MySQL 中 fetch_array 和 MySQL_fetch_object 的区别是什么?
以下是 MySQL_fetch_array 和 MySQL_fetch_object 的区别:
MySQL_fetch_array()-将结果行作为关联数组或来自数据库的常规数组返回。
MySQL_fetch_object -从数据库返回结果行作为对象。
Was this helpful?
0 / 0