最近在网上看到个关于在mysql触发器里面回滚不满足条件数据回滚的问题,我是弄Oracle数据库的,感觉在mysql中应该
实现起来没什么问题,所以亲测了,建了两张表,先写了个可以实现的触发器,就是下面的insert方法,经测试是OK的,将
insert注释,改成回滚,然后发现完全编译不通过!!!所以经测试是不能回滚的,毕竟曾经用mysql数据库,不小心删除
了整张表数据,怎么也无法回滚还原。但是在触发器里是可以写出类似回滚操作的办法的(大神想的,我只是网上看到而已)
解决方法如下:将①中的BEFORE改成AFFTER,再在不满足条件回滚的判断条件执行里面,写个delete TABLE_NAME where
ID = OLD.ID;完成了,不过这种方法其实只对有唯一标识符的表结构有效,比如没了ID你又没有可以判断数据唯一性的字段,这
种方法就行不通了。
CREATE TRIGGER BASE_TEXT_TRIGGER
BEFORE insert ON BASE_TEXT -- ①
FOR each row
BEGIN
DECLARE P_CNT INT;
select count(*) into P_CNT
from SYS_USER
where USER_CODE = NEW.USER_CODE
and USER_CODE != 'LLF' ;
#不满足条件回滚
if (P_CNT <= 0) then
-- insert into SYS_USER(ID,USER_CODE,USER_NAME) VALUES(unix_timestamp(now()),'12345','uuUUUUUUU'); # 可以实现
rollback tran; # 完全无法完成编译通过
end if;
END