Mysql学习06之配套sql语句

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 c r e a t e t r i g g e r a f t e r o r d e r a f t e r i n s e r t o n m y o r d e r f o r e a c h r o w b e g i n u p d a t e m y g o o d s s e t i n v = i n v 1 w h e r e i d = 2 ; e n d create trigger after_order after insert on my_order for each row begin -- 触发器内容开始 update my_goods set inv = inv - 1 where id = 2 ; end -- 触发器内容结束 -- 结束触发器
– 修正临时结束语句结束符
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 c r e a t e t r i g g e r a f t e r o r d e r a f t e r i n s e r t o n m y o r d e r f o r e a c h r o w b e g i n : : o l d , n e w u p d a t e m y g o o d s s e t i n v = i n v n e w . g n u m b e r w h e r e i d = n e w . g i d ; e n d create trigger after_order after insert on my_order for each row begin -- 触发器内容开始: 新增一条订单: old没有, new 代表新的订单记录 update my_goods set inv = inv - new.g_number where id = new.g_id ; end -- 触发器内容结束 -- 结束触发器
– 修正临时结束语句结束符
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 ;

猜你喜欢

转载自blog.csdn.net/yangyang_A/article/details/82828755