SQLite:从之前到之后触发商店信息

时间:2017-12-20 07:55:59

标签: sql sqlite

到目前为止,我还没有找到解决方案。好像那里没有那么多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上运行。

2 个答案:

答案 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获得微秒时间戳。