Mysql学习06之配套sql语句
事务安全
– 创建一个账户表
create table if not exists my_account(
number char(16) not null unique comment ‘账户’,
name varchar(20) not null,
money decimal(10,2) default 0.0 comment “账户余额”
)charset utf8;
– 插入数据
insert into my_account values
(‘000000000001’,‘张三’,1000),
(‘000000000002’,‘李四’,2000);
开启手动事务
start transaction;
– 事务操作: 1 李四账户减少
update my_account set money = money - 1000 where id = 2;
– 实务操作: 2 张三账户增加
update my_account set money = money + 1000 where id = 1;
– 提交事务:
commit;
回滚点操作
– 开启事务
start transaction;
– 事务处理1: 张三价钱
update my_account set money = money + 10000 where id = 1;
– 设置会滚点
savepoint sp1;
– 银行扣税
update my_account set money = money -10000 * 0.05 where id = 2; – 错误
– 回滚到回滚点
rollback to sp1;
– 回滚到回滚点
rollback to sp1;
– 继续操作
update my_account set money = money -10000 * 0.05 where id = 1;
– 查看结果
select * from my_account;
– 提交结果
commit;
自动事务: 关闭自动事务
– 关闭自动事务提交
set autocommit = 0;
变量
系统变量
查看系统变量
– 查看所有系统变量
show variables;
– 查看系统变量值
select @@version, @@autocommit,@@auto_increment_offset;
修改会话级别变量
set autocommit = 0;
set @@autocommit = 0;
修改全局级别变量.
set global autocommit = 0;
自定义变量
定义自定义变量
– 定义自定义变量
set @name = ‘张三’;
– 查看自定义变量
select @name;
– 定义变量
set @age :=18;
– 从表中获取数据赋值给变量
select @name := name, name from my_student;
select name,age from my_student where id = 2 into@name,@age;
触发器
创建触发器
– 创建表
create table my_goods(
id int primary key auto_increment,
name varchar(20) not null,
price decimal(10,2) default 1,
inv int comment ‘库存数量’
)charset utf8;
insert into my_goods values(null,‘vivo’,5000,100),
(null,‘xx’,6000,200);
– 创建订单表
create table my_order(
id int primary key auto_increment,
g_id int not null comment ‘商品id’,
g_number int comment ‘商品数量’
)charset utf8;
– 触发器: 订单生成一个, 商品库存减少
– 临时修改语句结束符
delimiter
– 修正临时结束语句结束符
delimiter ;
插看所有触发器
show triggers\G
– 查看触发器创建语句
show create trigger after_order\G
– 注意: 加\G的时候sql语句末尾就不要再加分号了,否则最后会有一行
– ERROR:
– No query specified
使用触发器
– 插入订单
insert into my_order values (null,1,2);
删除触发器
– 删除触发器
drop trigger after_order;
触发器记录
– 触发器: 订单生成一个, 商品库存减少
– 临时修改语句结束符
delimiter
– 修正临时结束语句结束符
delimiter ;
SQL编程中的代码执行结构
分支结构
– 触发器: 订单生成之前要判断库存是否满足
– 修改语句结束符
delimiter %%
create trigger before_order before insert on m_order for each row
begin
– 判断商品库存是否足够
-- 获取商品库存: 商品库存在表中
select inv from my_goods where id = new.g_id into @inv;
-- 比较库存
if @inv < new.g_number then
-- 库存不够: 触发器没有提供一个能够阻止事件发生的能力(所以要暴力报错)
insert into XXX values (XXX);
end if;
end
%%
– 改回语句结束符
delimiter ;