关于数据库触发器(trigger)的简单使用操作

最近在做一些东西,用到关于数据库触发器的简单使用。比如当我们在做用户模块的表设计的时候,我们建了联用户信息表(t_user)和账号表(t_account),账号表(t_account)用来进行账号的注册 ,密码的修改等操作,而用户表(t_user)则用来存储用户的基本信息(比如:姓名,年龄等),通常我们在 t_user中创建外键(userid)进行关联t_account以保证每个账号下对应一个用户信息。

当账号(t_account)注册成功后,如何在用户(t_user)中同时添加相应信息以保证数据的实时性和准确性。

通常我们的做法是,当注册成功  t_account中 insert 一组账号信息 同时在t_user表中相应的insert 一组信息。可以达到此目的。当然这样的做法是没问题的,只是比较麻烦,浪费时间和经历。最主要的是特么的谁没事写那么多sql 干什么,有简单的办法可以做到为什么要这么折腾人。

那么,我们来看下如何不写一句代码就可以实现这个功能呢。

触发器!触发器!触发器! 重要的事情要说三遍。。。

那么什么是触发器(trigger),这里我们引用百度百科里面的介绍(因为我总结出来怕你们看不懂,因为我特么的也不知道!!!)

  1. 触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。SQL3的触发器是一个能由系统自动执行对数据库修改的语句。
  2. 触发器可以查询其他表,而且可以包含复杂的SQL语句。它们主要用于强制服从复杂的业务规则或要求。例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。
  3. 触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。
  4. 触发器与存储过程的唯一区别是触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行。

好了,介绍完触发器,我们接下来该看看怎么玩它了。这里我们用SQLyog来创建,

语法: 

CREATE
    TRIGGER `jony_keer`.`ins_account` AFTER INSERT
    ON `jony_keer`.`t_account`
    FOR EACH ROW BEGIN
    INSERT INTO `t_user`(`userid`,`cellphone`,`account_psd`)  VALUES  (new.`account_id`,new.`cellphone`,new.`account_psd`);
    END$$

TRIGGER  触发器

`jony_keer`.`ins_account` 触发器名称   jony_keer是我的数据库名字  ins_account 才是实际的触发器名称

AFTER 表示 执行条件,有 BEFORE(之前 ) AFTER(之后)

INSERT ON 表示在执行了 插入操作  ,有INSERT/UPDATE/DELETE 三种 

`jony_keer`.`t_account` 接下来的这个是表示触发器所在的表(可以理解为 触发器在t_account 表插入一组出具后执行)

FOR EACH ROW BEGIN  固定于法  后面跟你要做的事情例如我要做的事情是在t_user表中插入

`userid`,`cellphone`,`account_psd` 三个记录

INSERT INTO `t_user`(`userid`,`cellphone`,`account_psd`)  VALUES  (new.`account_id`,new.`cellphone`,new.`account_psd`);

咦!  new 是什么玩意。。。

好吧! new 其实就是t_account 表中插入的数据  我们把 t_account 表中插入的  account_id  cellphone account_psd 赋值给t_user表中的 userid  cellphone account_psd ,OK!这样一个简单的触发器就做好了。

接下来我们看具体的表结构吧。

 

 上图中我们可以看到,我已经做好的表 和触发器。下来我们看具体的两个表结构:

t_account

t_user

可以看到我们两个表中目前还没有数据,接下来我们要去做点事情,给表t_account中添加一组数据,看看t_user表是否会给我们带来惊喜呢。这里我在已经做好程序接口,只需要调用一下就OK。

/**
 * 注册
 * @param cellphone
 * @param psd
 * @return
 */
@RequestMapping(value = "register", method = RequestMethod.POST)
@ResponseBody
public ResponseModel registerController(@RequestParam(value = "cellphone", required = true) String cellphone, @RequestParam(value = "psd", required = true) String psd) {
    return service.insertRegister(cellphone,psd);
}

 

/**
 * 插入信息(注册账号)INSERT
 */

public ResponseModel insertRegister(String cellphone, String psd){
    if (!MobileUtils.isMobileNO(cellphone)) {
        return new ResponseModel(false, "手机号不正确!");
    }
    int success = getActIsExist(cellphone);
    if (success == 1) {
        return new ResponseModel(false, "该手机号已经注册,请前往登录。");
    }
    int i=0;
    try {
        i = accountRepository.insertRegisterModelOne(cellphone,psd);
    }catch (Exception e){
        i=0;
    }
    if (i > 0) {
        return new ResponseModel(true, "注册成功!");
    } else {
        return new ResponseModel(false, "注册失败!");
    }
}
 //新增一条(注册)
    @Query(value = "INSERT INTO t_account (cellphone,account_psd) VALUES (?1, ?2)", nativeQuery = true)
    @Modifying
    int insertRegisterModelOne(String cellphone, String account_psd);

上面三个段代码是我们已经做好的注册接口,接下来我们就去启动服务器开始验证吧。打开Postman 调用服务器接口

我们看下t_account中的数据

我们看下t_user中的数据

我们可以看到,t_account表中的 account_id   cellphone  account_psd 已经插入进去,并且 t_user表中同时也插入 userid cellphone 和 account_psd  而且是一一对应的。

惊喜不惊喜,意外不意外,不需要写一句代码,就完成了我们想要的功能。

好了,一个简单的触发器就这么搞定了,当然要做条件触发器也是可以的,语法就那样,各位可以去尝试尝试。

  • 48
    点赞
  • 166
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值