【问题标题】:Does sqlite3 support a trigger to automatically update an 'updated_on' datetime field?sqlite3 是否支持自动更新“updated_on”日期时间字段的触发器?
【发布时间】:2009-12-26 20:08:26
【问题描述】:

我有一张像这样的表

user_id   |  name   |  created_on   |   updated_on
--------------------------------------------------
1         | Peter D | 1/1/2009      |

如果我插入或更新一条记录,我想要一个触发器来使用 datetime('now') 更新 updated_on 字段。但我找不到函数名称来定位 sqlite3 中最近更新的行。有吗?

【问题讨论】:

  • 谢谢哈桑,问题是我无法从触发器中找到一种方法来定位 sqlite3 中最后更新的行。我在另一个触发器中使用“last_insert_rowid()”。但我正在寻找“last_update_rowid()”,但找不到类似的东西。
  • @DougCurrie 提供的答案非常好用!可惜SQLite文档不是很清楚Create trigger SQLite

标签: sql sqlite


【解决方案1】:
CREATE TRIGGER your_table_trig AFTER UPDATE ON your_table
 BEGIN
  update your_table SET updated_on = datetime('now') WHERE user_id = NEW.user_id;
 END;

【讨论】:

  • 如果这回答了您的问题,那么习惯上通过单击答案旁边的复选标记来“接受”答案。
  • 如果我没记错,那么它会抛出一个错误,例如 - 提交数据时发生错误:触发器递归级别太多
  • 你可能需要设置sqlite3_limit(db,SQLITE_LIMIT_TRIGGER_DEPTH,...) -- 见sqlite.org/pragma.html#pragma_recursive_triggers
  • 查看this question 的答案,了解在不限制触发深度的情况下避免触发递归问题的方法。
【解决方案2】:

您可以指定触发器以在行更改时更新行的 updated_on 列,但是,更改会再次调用相同的触发器,最终会出现错误 too many levels of trigger recursion
为了避免这种情况,您可以指定要触发触发器的列,当然您需要排除updated_on

CREATE TRIGGER your_table_trig 
AFTER UPDATE OF ID, 
  user_id, 
  name, 
  created_on ON your_table 
FOR EACH ROW BEGIN UPDATE your_table 
SET updated_on = DATETIME ('NOW') 
WHERE rowid = new.rowid ; END;

【讨论】:

  • 这避免了递归问题,但引入了另一个问题:您必须记住每次更改架构时都更新触发器。但是,当您知道架构不会更改时,这是一个不错的解决方法。
猜你喜欢
  • 2017-08-03
  • 1970-01-01
  • 2011-08-10
  • 2014-02-19
  • 1970-01-01
  • 2018-08-06
  • 1970-01-01
  • 2022-10-18
  • 1970-01-01
相关资源
最近更新 更多