到目前为止,我还没有找到解决方案。好像那里没有那么多SQLite触发器。
我尝试存档列的更新(如果列更新时为空)。
在MySQL中,我可能会做类似NEW.updated_at = now()
CREATE TRIGGER test_in
BEFORE UPDATE ON test
FOR EACH ROW
WHEN (NEW.updated_at IS NULL)
BEGIN
NEW.updated_at = now();
END;
但我读到你无法在SQLite中修改NEW
。并且After-Trigger中NEW.updated_at
的值已经设置为旧值。有没有办法暂时存储该字段并在After-Trigger中使用它?或者防止它在Before-Trigger中被覆盖。
我怎么能在SQLite中这样做?
修改 我的原始触发器如下所示:
CREATE TRIGGER IF NOT EXISTS UpdatedAt_Update_${name}
AFTER UPDATE ON ${name}
FOR EACH ROW
WHEN OLD.updated_at = NEW.updated_at
BEGIN
UPDATE ${name}
SET updated_at = strftime('%Y-%m-%d %H:%M:%f', 'now', 'localtime')
WHERE rowid = OLD.rowid;
END;
问题是,如果我使用相同的updated_at
进行更新,则将其替换为新的更新。
编辑2:TL; DR
我想要在更新中存档
updated_at
:使用给定值updated_at
:使用当前的microtime 编辑3: 所以我尝试了@LS_ᴅᴇᴠ建议。
CREATE TRIGGER test_in
AFTER UPDATE OF id, content ON test
FOR EACH ROW
WHEN NEW.updated_at IS NULL
BEGIN
UPDATE test
SET updated_at = strftime('%Y-%m-%d %H:%M:%f', 'now', 'localtime')
WHERE id = NEW.id;
END
这会将updated_at
设置为列为空时的当前时间。但只有一次。下次在没有给出新值时保持updated_at
。我正在使用SQLite数据库浏览器对此进行测试。但它也没有使用适用于cordova的SQLite插件在Android上运行。
答案 0 :(得分:0)
如果要更改表中的某个值,则必须在之后执行另一个UPDATE语句。要检查原始更新是否更改了列,您必须比较旧值和新值。 (并且为了防止触发器以递归方式调用自身,将其限制为某些列。)
CREATE TRIGGER test_in
AFTER UPDATE OF (other, columns) ON test
FOR EACH ROW
WHEN NEW.updated_at IS OLD.updated_at
BEGIN
UPDATE test
SET updated_at = now()
WHERE id = NEW.id;
END;
答案 1 :(得分:0)
如果你希望"更新一个列,如果它在更新"时为空,那么你的时间必须是:
S=1a0e22ff
echo "${S//??/ 0x&}"
但如果没有指定新数据,我建议更新要求更新列:
...
WHEN OLD.update_at IS NULL
...
无论如何,正如我已经评论过的那样,你可以使用普通的SQLite获得微秒时间戳。