关于数据库触发器(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),这里我们引用百度百科里面的介绍(因为我总结出来怕你们看不懂,因为我特么的也不知道!!!)
- 触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会**它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。SQL3的触发器是一个能由系统自动执行对数据库修改的语句。
- 触发器可以查询其他表,而且可以包含复杂的SQL语句。它们主要用于强制服从复杂的业务规则或要求。例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。
- 触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。
- 触发器与存储过程的唯一区别是触发器不能执行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 而且是一一对应的。
惊喜不惊喜,意外不意外,不需要写一句代码,就完成了我们想要的功能。
好了,一个简单的触发器就这么搞定了,当然要做条件触发器也是可以的,语法就那样,各位可以去尝试尝试。
推荐阅读
-
数据库触发器(Trigger)的一点使用心得
-
在SpringBoot项目中使用JPA实现简单的数据库操作
-
数据库中的事务、存储过程和触发器的简单使用
-
数据库中的事务、存储过程和触发器的简单使用
-
在MySQL中使用触发器Trigger的操作过程
-
关于数据库触发器(trigger)的简单使用操作
-
Java语言mysql数据库的访问步骤,一个简单的实例——使用DAO(数据库操作类 Data Access Object ) 实现对mysql数据库的增删改查
-
数据库触发器(Trigger)的一点使用心得
-
在MySQL中使用触发器Trigger的操作过程
-
使用phonegap关于操作数据库的具体实现方法介绍