SQLite:从之前到之后触发存储信息

问题描述 投票:0回答:2

到目前为止,我没有找到解决方案。好像那里没有那么多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进行更新,它将被新的替换。

EDITH 2:THB; 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数据库浏览器进行测试。但它也没有在Android上使用针对cordova的SQLite插件。

sql sqlite
2个回答
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;

0
投票

如果你想要“更新一个列,如果它在更新时是空的”,那么你的时间必须是:

...
    WHEN OLD.update_at IS NULL
...

但是如果没有指定新数据,我建议更新列更新要求:

...
    WHEN NEW.update_at IS NULL
...

无论如何,正如我已经评论过的那样,你可以使用普通的SQLite获得微秒时间戳。

© www.soinside.com 2019 - 2024. All rights reserved.