当数据库的引擎为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操作