android:SQLite--触发器详解

关于SQLite基础部分:SQLite基础学习

SQLite 的触发器是数据库的回调函数,它会自动执行/指定的数据库事件
发生时调用。SQLite 的触发器可以指定在特定的数据库表发生 delete、
insert或update时触发,或在一个或多个指定表的列发生更新时触发。
SQLite 只支持 FOR EACH ROW 触发器,不支持 FOR EACH STATEMENT 触发器。FOR EACH ROW是指触发器在操作每一行时被激活;FOR EACH STATEMENT是指在执行每条SQL语句时被激活;如果有when 子句,则只针对 when 子句为真的指定行执行 SQL 语句。如果没有提供 when 子句,则针对所有行执行 SQL 语句。BEFORE 或 AFTER 关键字决定何时执行触发器动作,决定是在关联行的插入、修改或删除之前或者之后执行触发器动作。当触发器相关联的表删除时,自动删除触发器(Trigger)。要修改的表必须存在于同一数据库中。一个特殊的 SQL 函数 RAISE() 可用于触发器程序内抛出异常。

/**  触发器的格式
         * 
         *     create trigger trigger_nameXX
               before/after 
         *     insert/update/delete  on  table_nameXX   when  xxxxx
         *     for each row
         *     begin
         *        XXXXXXXXXX;
         *     end;
         */

下面是是一个详细的例子:
1、建立两张表:

       /**  部门信息表
         *   department_id   部门编号
         *   department_name 部门名称
         */
    String sql="CREATE TABLE IF NOT EXISTS  departmentinfo (department_id integer primary key autoincrement,department_name varchar(20))";

        /**  员工信息表
         *   emp_id          员工编号
         *   emp_name;       员工名称
         *   department_id   部门编号
         */
    String sq2="CREATE TABLE IF NOT EXISTS empinfo (emp_id integer primary key autoincrement,emp_name varchar(20),department_id integer)";  

打开cmd,添加进两张表:
关于sqlite在cmd中的打开操作,请点击
这里写图片描述

2、创建触发器

 /**
      * 
      * 创建触发器
      * 1、当emp_info插入员工信息时,先要检查部门信息表中是否有该部门编号,
      *    如果没有则插入失败,返回no department_id
      * 2、当emp_info更新员工信息时,先要检查部门信息表中是否有该部门编号,
      *    如果没有则更新失败,返回no department_id
      * 3、当删除部门信息表中某一行数据时,相应的在empinfo表中对应的员工也应该删除
      */

     //创建触发器1
   String trigger1="create trigger emp_insert " +
                   "before insert on empinfo " +
                   "for each row " +
                   "begin " +
                     "select raise(rollback,'on department_id') " +
                     "where (select department_id from departmentinfo where department_id=new.department_id) is null; " +
                   "end;";                             
    //创建触发器2       
   String trigger2="create trigger emp_update " +
                   "before update on empinfo " +
                   "for each row " +
                   "begin " +
                     "select raise(rollback,'on department_id') " +
                     "where (select department_id from departmentinfo where department_id=new.department_id) is null; " +
                  "end;";
    //创建触发器3
   String trigger3="create trigger dep_delete " +
                   "before delete on departmentinfo " +
                   "for each row " +
                   "begin " +
                     "delete from empinfo where department_id=old.department_id;  " +
                  "end;";

在cmd中
创建:emp_insert

创建:emp_update
这里写图片描述
创建:dep_delete这里写图片描述

3、插入数据测试

现在测试emp_insert触发器:
这里写图片描述

从上图中分析,由于在departmentinfo表中还没有部门编号,所以员工信息表中插入数据失败,返回no department_id。

下面插入测试数据:

Insert into departmentinfo values(1,’java’);
Insert into departmentinfo values(2,’c’);

Insert into empinfo values(1,’atm’,1);
Insert into empinfo values(2,’atm2’,1);
Insert into empinfo values(3,’atm3’,2);

现在测试dep_delete触发器:

这里写图片描述

从上图中可以看出,删除了departmentinfo表中的department_id=2;与此同时empinfo表中department_id=2的员工信息也删除了

现在测试emp_update触发器:
这里写图片描述
由于departmentinfo中没有department_id=3这个编号,所以插入失败,返回错误值no department_id

4、列出所有的触发器

1、列出所有触发器
SELECT name FROM sqlite_master WHERE type = 'trigger'
2、列出emp_info中所有触发器
SELECT name FROM sqlite_master
           WHERE type = 'trigger' AND tbl_name = 'emp_info';

5、删除触发器

drop trigger trigger_name

eg:drop trigger dep_delete

6、特殊的 SQL 函数 RAISE()

RAISE ( ABORT , error-message ) 
RAISE ( FAIL  , error-message )  
RAISE ( ROLLBACK, error-message )  
RAISE ( IGNORE )

ABORT&& FAIL&&ROLLBACK && IGNORE

abort,fail,rollback三者的具体区别也不太明白,自己测试了一下,插入失败三者同样换回error-message。如何有了解的朋友请留言,谢谢。

7、 new&& old的问题

   new是新插入的数据,old是原来的数据

   insert只会有new,代表着要插入的新记录

   delete只会有old,代表着要删除的记录

   update由于执行的是先删除旧的记录,再插入新的记录,因此newold都会有。
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值