欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-07 14:36:08
...

最近在做一些东西,用到关于数据库触发器的简单使用。比如当我们在做用户模块的表设计的时候,我们建了联用户信息表(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!这样一个简单的触发器就做好了。

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

 

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

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

t_account

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

t_user

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

可以看到我们两个表中目前还没有数据,接下来我们要去做点事情,给表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 调用服务器接口

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

我们看下t_account中的数据

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

我们看下t_user中的数据

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

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

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

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

相关标签: 数据库 触发器