首页 > 解决方案 > Sqlite 在插入触发器中运行更新以执行更新触发器

问题描述

使用sqlite,我希望在插入和更新时使用触发器从给定的“id”生成一个字段“url”。例如id: '1' => url: 'test.com/1'

该表如下所示:

CREATE TABLE t1 (
  id TEXT,
  url TEXT
 );

由于 sqlite 无法为更新和插入运行相同的触发器,因此我看到了两个选项来完成此操作。

选项 A

CREATE TRIGGER run_updates_on_insert AFTER INSERT ON t1
  BEGIN
    UPDATE t1 SET id = NEW.id WHERE id = NEW.id;
  END;

CREATE TRIGGER set_url_on_update BEFORE UPDATE on t1
  BEGIN
   UPDATE t1 SET url = 'test.com/' || NEW.id WHERE id = OLD.id;
  END;

选项 B

CREATE TRIGGER set_url_on_insert AFTER INSERT on t1
  BEGIN
   UPDATE t1 SET url = 'test.com/' || NEW.id WHERE id = NEW.id;
  END;

CREATE TRIGGER set_url_on_update BEFORE UPDATE on t1
  BEGIN
   UPDATE t1 SET url = 'test.com/' || NEW.id WHERE id = OLD.id;
  END;

这两个选项都给了我想要的结果,我倾向于选择选项 A,因为我只需要编写一次更新逻辑,但我想知道是否有任何其他优点/缺点更喜欢另一个?

编辑:对于这个特定的用例,最好使用生成的列(请参阅下面的 forpas 答案)

标签: sqlsqlitetriggersinsertsql-update

解决方案


从 SQLite 版本 3.31.0 (2020-01-22) 开始,您可以创建生成的列(存储或虚拟),因此您不需要任何触发器:

CREATE TABLE t1 (
  id TEXT,
  url TEXT GENERATED ALWAYS AS ('test.com/' || id) STORED
 );

推荐阅读