sql - Sqlite 在插入触发器中运行更新以执行更新触发器
问题描述
使用sqlite,我希望在插入和更新时使用触发器从给定的“id”生成一个字段“url”。例如id: '1' => url: 'test.com/1'
该表如下所示:
CREATE TABLE t1 (
id TEXT,
url TEXT
);
由于 sqlite 无法为更新和插入运行相同的触发器,因此我看到了两个选项来完成此操作。
选项 A
- 插入后运行触发器,将 id 更新为自身,进而触发更新触发器
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 答案)
解决方案
从 SQLite 版本 3.31.0 (2020-01-22) 开始,您可以创建生成的列(存储或虚拟),因此您不需要任何触发器:
CREATE TABLE t1 (
id TEXT,
url TEXT GENERATED ALWAYS AS ('test.com/' || id) STORED
);
推荐阅读
- actionscript-3 - 为什么“else”语句在 AS3 中不起作用?
- c# - 匿名和 Windows 身份验证的混合,并针对某些 Web 方法强制 Windows 身份验证
- flutter - 在 Flutter 中实现“添加到主屏幕”
- java - Xpath 包含正则表达式模式
- windows - 创建具有多个屏幕的 MonoGame 应用程序
- python - 如何同时使用两个或多个 .npy 文件训练我的神经网络模型?
- c - C:以数组形式请求输入
- linux - 如何从 Bash 脚本授予用户 SUDO 权限
- qt - 更新自己的 Qt 应用程序
- xml - 如何创建“嵌套列表”并以 HTML 格式显示