mysql使用触发器实现check约束功能
来源:互联网 发布:淘宝自制食品怎么上架 编辑:程序博客网 时间:2024/04/30 02:31
MySQL可以使用check约束,但check约束对数据验证没有任何作用。
create table temp(
id int auto_increment,
name varchar(20),
age int,
primary key(id),
check(age > 20)
);
create table temp(
id int auto_increment,
name varchar(20),
age int,
primary key(id),
check(age > 20)
);
上面check约束要求age必须大于20,但没有任何作用。但是创建table的时候没有任何错误或警告。
当前的应用场景是,当创建订单的时候,先检查用户账户的余额,余额不足则终止订单创建操作。通过查阅资料,从Mysql 5.5 开始为我们提供了SIGNAL函数来实现这个功能。
CREATE TRIGGER `tg_order_create` AFTER INSERT ON `tp_order` FOR EACH ROW BEGIN DECLARE msg varchar(200); /*冻结金额*/ IF 2=NEW.condition THEN UPDATE `tp_user` SET `frozen_amount`=`frozen_amount`+NEW.amount WHERE `id`=NEW.uid AND `amount`-`frozen_amount` > NEW.amount; /*如果余额不足,产生一个错误*/ IF ROW_COUNT() <> 1 THEN set msg = "用户余额不足以完成支付."; SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = msg; END IF; /*扣除金额*/ ELSEIF 3=NEW.condition THEN UPDATE `tp_user` SET `amount`=`amount`-NEW.amount WHERE `id`=NEW.uid AND `amount`-`frozen_amount` > NEW.amount; /*如果余额不足,产生一个错误*/ IF ROW_COUNT() <> 1 THEN set msg = "用户余额不足以完成支付."; SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = msg; END IF; END IF; END;这里这条触发器的功能是库存操作,当库存足够的时候 减少库存,否则 抛出一个异常并报告商品库存不足:
CREATE TRIGGER `TG_order_detail_dec_stock` BEFORE INSERT ON `tp_order_detail` FOR EACH ROW BEGIN DECLARE msg VARCHAR(200); UPDATE `tp_stock` SET `num`=`num`-NEW.num WHERE `goods_id`=NEW.goods_id AND `mid`=NEW.mid AND `num`>=NEW.num; IF ROW_COUNT() <> 1 THEN SELECT CONCAT(`name`, ' 库存不足.') INTO msg FROM `tp_goods` WHERE `id`=NEW.goods_id; SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = msg; END IF; END;
0 0
- mysql使用触发器实现check约束功能
- 利用MySQL触发器实现check和assertion
- 触发器和check约束区别
- mysql 的 check约束
- MySQL enum用法--实现类似check的输入约束
- mysql数据库 check约束无效
- MySQL中CHECK约束无效
- mysql数据库 check约束无效
- sql CHECK ,UNIQUE 约束(mysql)
- 【mysql 触发器】触发器使用
- Mysql里check约束无效怎么办?
- MySQL的check约束无效怎么办?
- check约束
- check约束
- check 约束
- oracle中使用CHECK作限制约束
- MySQL - check使用
- oracle中使用触发器实现查询分页功能
- -页面传值获取参数,已对中文进行解码
- 一个域名下两个不同端口的项目session不能同时存在
- python递归深度报错: RuntimeError: maximum recursion depth exceeded
- 274. H-Index
- ORMLite学习入门笔记
- mysql使用触发器实现check约束功能
- windows下修改memcached服务的端口号
- Kaggle竞赛优胜者源代码剖析(一)
- python中if __name__ == '__main__': 的解析
- 怎样快速搜索自己所需的资料?(90%的人不会使用此方法)
- 147. Insertion Sort List
- ubuntu下的samba配置
- java调用ffmpeg获取视频时长
- Fragment AutoCompleteTextView xml动画(补间 属性动画)