事物、存储过程及函数等(MySQL)

一、事物

当数据库的引擎为innodb时,才能创建事物

mysql 事物:要不一起成功,要不一起回滚,只有当commit的时候数据库的数据才会发生变动

 start transaction;-- 开启事务
 insert into wallet values(4,1000);-- 执行操作
 savepoint four;-- 保存一个快照,回滚可以指定任意快照
 insert into wallet values(5,1000);
 savepoint five;
 rollback to four;-- 回滚到快照4
 commit;-- 提交,发现只有4号账户有钱

 

事物的4大特性:(数据库4大操作CURD)

ACID

atomicity : 原子性--事物不能再分

consistency: 一致性--事务提交数据必须正确

isolation : 隔离性--事物之间相互隔离

durability : 持久性--事物一旦提交,就是永久数据

二、存储过程

在事物或者存储过程中,子SQL语句使用的分号会直接把SQL语句传递给服务器,为了避免分号的影响,可以暂时修改SQL语句的结束符号,使用完过程或事物再修改回来:

其实,这个修改对命令行界面非常有用,对图形化界面用处不大

delimiter //

一个小的存储过程:

 delimiter //
 create procedure proc()
 begin
 start transaction
 /* 这里开启一个事物的目的是为了所有的修改保持一致性
 否则,如果第二个SQL出错,第一个SQL依然会执行!(顺序执行)*/
 update wallet set balance = balance + 50;
 update t3 set name = 'tom';
 commit;
 end;
 delimiter ;
 -- 此时存储过程没有被执行,所以数据库并不会发生变化
 call proc(); -- 执行
-- 删除存储过程
 drop procedure proc;

 

三、函数

有趣的函数

 -- 生成随机数
 select rand(); 
 -- 数据库实现抽奖!
 /*从student表中随机抽取三个人排序*/
 select * from student order by rand() limit 3;
 -- 向上取整
 select ceil(3.1);-- 4
 -- 向下取整
 select floor(3.1);-- 3
 -- 四舍五入
 select round(3.1);-- 3
 -- 截取小数
 select truncate(3.1415926,2);-- 3.14

  

字符串:

 -- 变成大写
 select ucase('fuck');-- FUCK
 -- 变成小写
 select lcase('FUCK');-- fuck
 -- 截取字符串
 select left('fuck',2);-- fu
 select right('fuck',2);-- ck
 select substring('fuck',2,3);-- uck
 -- 拼接字符串
 select concat('fuck','you');-- fuckyou
 /*会把student表中的name和age两列一起输出*/
 select concat(name,'|',age) from student;

  

others

 -- 获取当前时间(年月日)
 select now();
 -- 获取当前时间戳
 select unix_timestamp();
 -- 把年月日分开,字段名改为year、month、day
 select year(now()) year,month(now()) month,day(now()) day;
 -- 对数据加密
 select sha('zhangyaoyuan');-- 输出加密后的内容

  

四、数据库规范

数据库规范

1、表示判断的元组有限制

字段名:is_xxx (注意:pojo布尔类型的命名不能加 is!!!)

数据类型:tinyint (并且在图形化界面里选项里面选择无符号,如果是命令行:unsigned tinyint)

数据长度:1

2、表名和字段名必须小写!可以使用下划线连接,不能出现大写字母,因为是关系型数据库,所以修改字段名代价很大,一定要规范。

3、表名不能用复数,不能使用关键字!

4、主键索引:pk_xxx

唯一键索引:uk_xxx

普通索引:idx_xxx

5、如果使用小数,禁止使用float和double,一律使用 decimal

?6、比较小的字符串使用char类型,不使用变长的varchar

7、规范的表必须包含三个字段:id、create_time、update_time

id必须是无符号的bigint类型,单表的id必须自增1(除非是分布式id?)

create_time、update_time必须是datatime类型

sql规范

1、count(全字段名)不能等价于count(*),因为count(*)会包括null

2、不能用 = null判断空,要用 is(null)

?3、不要使用外键和级联。需要它们的功能一切在应用层解决

?4、实际开发过程,不建议使用存储过程,不利于调试和扩展。

5、要删除和更新数据,先查询数据!避免误操作

?6、尽量避免子查询的in操作

7、编码格式:utf-8

posted @ 2021-02-15 22:40  yyComeOn  阅读(41)  评论(0编辑  收藏  举报