sqlite触发器是在整个数据库上工作还是仅在更改的行上工作

时间:2015-07-22 14:25:38

标签: mysql sql sqlite triggers

我需要将sqlite触发器转换为mysql触发器。我已经转换了以下sqlite触发器

create trigger arpinsert after insert on arp
begin
    update arp set timeout = datetime('now', '60 seconds') where rowid = new.rowid and new.mac != '00:00:00:00:00:00';
    update arp set timeout = datetime('now')               where rowid = new.rowid and new.mac  = '00:00:00:00:00:00';
end;

进入以下mysql触发器

delimiter //
create
    trigger arpBeforeInsert
    before insert
    on arp for each row
        begin
            if new.mac != '00:00:00:00:00:00' then
                set new.timeout = date_add(now(), interval 60 second);
            else
                set new.timeout = now();
            end if;
        end;//
delimiter ;

我知道mysql触发器只触发受影响的行。 sqlite触发器是一样的吗?如果我删除了where rowid = new.rowid sqlite触发器会更新整个表吗?

1 个答案:

答案 0 :(得分:2)

SQLite documentation说:

  

此时SQLite仅支持FOR EACH ROW触发器,而不支持FOR EACH STATEMENT触发器。因此,明确指定FOR EACH ROW是可选的。 FOR EACH ROW意味着可以为触发器触发的语句插入,更新或删除的每个数据库行执行触发器中指定的SQL语句(取决于WHEN子句)。

但是,这仅适用于触发器本身。 触发器内的任何SQL语句都是独立的(如果要访问其他表/行,则必须如此)。因此,执行不带WHERE子句的UPDATE将更新表的所有行,就像触发器外部一样。