sqlite 触发器。

当具体的表发生特定的数据库事件时,触发器执行对应的SQL指令。触发器可以用来创建自定义完整性约束、日志改变、更新表和其他操作。

冲突解决
1. sqlite RAISE函数的使用

RAISE ( ABORT , ‘error-message’ )
RAISE ( FAIL , ‘error-message’ )
RAISE ( ROLLBACK, ‘error-message’ )
RAISE ( IGNORE )
RAISE (REPLACE, ‘error-message’ )

(1) ROLLBACK — 这个用到的相对较多

RAISE ( ROLLBACK, error-message )

当发生约束冲突,立即ROLLBACK,即结束当前事务处理,命令中止并返回SQLITE_CONSTRAINT代码。若当前无活动事务(除了每一条命令创建的默认事务以外),则该算法与ABORT相同。

(2) ABORT

RAISE ( ABORT, ‘error-message’ )

当发生约束冲突,命令收回已经引起的改变并中止返回SQLITE_CONSTRAINT。但由于不执行ROLLBACK,所以前面的命令产生的改变将予以保留。缺省采用这一行为。

(3) FAIL

RAISE ( FAIL, ‘error-message’ )

当发生约束冲突,命令中止返回SQLITE_CONSTRAINT。但遇到冲突之前的所有改变将被保留。例如,若一条UPDATE语句在100行遇到冲突100th,前99行的改变将被保留,而对100行或以后的改变将不会发生。

(4) IGNORE

RAISE ( IGNORE )

当发生约束冲突,发生冲突的行将不会被插入或改变。但命令将照常执行。在冲突行之前或之后的行将被正常的插入和改变,且不返回错误信息。

(5) REPLACE

RAISE (REPLACE, ‘error-message’ )

当发生UNIQUE约束冲突,先存在的,导致冲突的行在更改或插入发生冲突的行之前被删除。这样,更改和插入总是被执行。命令照常执行且不返回错误信息。当发生NOT NULL约束冲突,导致冲突的NULL值会被字段缺省值取代。若字段无缺省值,执行ABORT算法。

new && old的问题

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

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

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

update由于执行的是先删除旧的记录,再插入新的记录,因此new和old都会有。

2. 如何创建触发器

  create trigger trigger_nameXX               -- 创建触发器名称

  before/after                              -- 在你即将要执行的操作之前,还是之后

  insert/update/delete  on  table_nameXX  ...   -- 当你执行怎样的操作时 才会触发

  for each row                              --  row 是行的意思, 就是每一行


  begin                                -- 具体让触发器做什么  
     XXXXXXXXXX;

  end;

dmeo1

"create trigger abc " +

  "before insert on sms " +

   "for each row " +

   "begin " +
         "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;  " +
    "end;"

////////////////////////////////////////////////////
begin  end 中也就是 你需要触发器去执行的哪个操作

dmeo2 – (只贴了触发操作后需要执行的 begin end)更新或者插入数据时,查询是否有符合条件的数据存在, 存在则返回 (raise 函数上面有解释)

BEGIN 

select raise(rollback,'')  

where (select _id from sms

    where  message_id =  message_id  and (type= 1) and sub_id = new.sub_id) 

is not null;


END

dmeo3 —— 删除后或者插入数据后时,联动更新其他表

BEGIN

-- 更新ABC表

UPDATE ABC 

    SET 

    date = (strftime('%s','now') * 1000),

    msg_id =  new._id,

    msg_type =     

    (
     CASE WHEN chat_type != -1                           THEN      msg_chat_type 
          WHEN chat_type= -1 AND new.chat_type!= -1      THEN      new.rcs_chat_type 
          ELSE chat_type 
     END

     ),


    number =     

    (
     CASE WHEN new.rcs_msg_type != 7    THEN new.address
          ELSE rcs_number   
     END

     )  

WHERE threads._id = new.thread_id  ;  


--同时也更新DEF表

UPDATE DEF 

    SET 

    XXXXXXXXXX

WHERE threads. _id = new . thread_id; 


END

3. 常用的一些关于触发器

3.1 列出所有触发器

SELECT name FROM sqlite_master WHERE type = ‘trigger’

3.2 列出操作 “某个表 ” 时,会触发的所有触发器

SELECT name FROM sqlite_master
WHERE type = ‘trigger’ AND tbl_name = ‘xxxx’;

3.3 删除触发器

drop trigger xxxxx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空白的泡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值