sqlite 触发器。

前端之家收集整理的这篇文章主要介绍了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

猜你在找的Sqlite相关文章