mysql使用触发器实现check约束功能

MySQL可以使用check约束,但check约束对数据验证没有任何作用。 
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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值