SQLite触发器多语句执行后new.revision值未更新问题咨询
关于触发器中
NEW.revision值的问题解答 没错,你观察得完全正确——NEW.revision确实只反映触发事件发生瞬间的原始值,触发器执行过程中对原表该行的修改,不会自动同步更新NEW记录里的字段内容。
这是因为当触发事件(比如UPDATE)被触发时,数据库会立刻创建NEW和OLD这两个特殊记录,它们对应触发时刻目标行的状态。后续你在触发器里对原表该行做的任何修改,都不会反向更新已经初始化好的NEW变量。
快速获取新修订号的几种方法:
方法1:在BEFORE触发器中直接修改
NEW变量
如果你的触发器是BEFORE UPDATE类型,那可以直接修改NEW.revision的值,这个修改会同时作用于原表的更新操作,以及后续的插入操作:CREATE TRIGGER your_trigger_name BEFORE UPDATE ON your_main_table FOR EACH ROW BEGIN -- 直接递增NEW.revision,这个值会被写入原表 NEW.revision = NEW.revision + 1; -- 插入新表时直接使用修改后的NEW.revision INSERT INTO your_other_table (revision, other_columns) VALUES (NEW.revision, NEW.other_columns); END;这种方式最简洁,因为BEFORE触发器阶段修改
NEW的字段,会直接成为最终写入原表的值,同时你也能在触发器里直接使用这个更新后的值。方法2:用
RETURNING子句捕获新值
如果是AFTER触发器,或者你必须先执行原表更新再获取值,可以用RETURNING把新修订号存入变量,再用变量插入:CREATE TRIGGER your_trigger_name AFTER UPDATE ON your_main_table FOR EACH ROW DECLARE new_revision INT; BEGIN -- 更新原表并返回新的修订号到变量 UPDATE your_main_table SET revision = revision + 1 WHERE id = NEW.id RETURNING revision INTO new_revision; -- 使用变量插入到另一张表 INSERT INTO your_other_table (revision, other_columns) VALUES (new_revision, NEW.other_columns); END;方法3:重新查询获取最新值
当然你也可以在更新后直接查询原表获取最新的修订号,不过这种方式不如RETURNING高效,因为多了一次额外的查询:SELECT revision INTO new_revision FROM your_main_table WHERE id = NEW.id;
内容的提问来源于stack exchange,提问作者Paul Calabro
相关产品推荐
相关产品推荐

