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