Derby Trigger on UPDATE:如何更新时间戳?
Posted
技术标签:
【中文标题】Derby Trigger on UPDATE:如何更新时间戳?【英文标题】:Derby Trigger on UPDATE: how to update a timestamp? 【发布时间】:2014-01-17 21:29:25 【问题描述】:简短:如何在 Apache Derby DB 上创建触发器以更新更改记录的时间戳?
调整现有项目以使用 Apache Derby 作为数据库软件, 我遇到了几个问题。大多数我可以使用***和搜索引擎解决, 但是对于这个我需要你的帮助。
使用其他数据库软件,我会做这样的事情:
CREATE TABLE myTable (
…
`lastchange` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
…
)
Derby 不喜欢 `,您必须单独创建触发器。 所以我试试这个:
CREATE TRIGGER updateTimestamp AFTER UPDATE ON mytable FOR EACH ROW
(UPDATE mytable SET lastchange= CURRENT_TIMESTAMP() )
我得到一个错误。哦,这个更新可能会导致触发器再次关闭......所以
CREATE TRIGGER updateTimestamp NO CASCADE BEFORE UPDATE ON mytable FOR EACH ROW
(UPDATE mytable SET lastchange= CURRENT_TIMESTAMP() )
会更好,对吧?
好吧,要么给我一个错误,告诉 Derby 不喜欢此语句中的第二个“UPDATE”。 但我不想插入或删除任何东西,我想更新已更改/将要更改的行的时间戳。
怎么做?
------更新------
当没有合乎逻辑的解决方案时,尝试一些魔法可能会有所帮助。
我删除了括号(尽管 Derby 文档和示例有它们)。
Derby 告诉我它不喜欢 BEFORE 上的 UPDATE 触发器(wtf?),所以我回到 AFTER,假设 Derby 知道它在那里做什么。
最后,虽然 CURRENT_TIMESTAMP 是一个函数,但 Derby 反对括号,所以我也删除了它们。看起来很奇怪,但如果这就是德比想要的......
CREATE TRIGGER updateTimestamp AFTER UPDATE ON votes FOR EACH ROW UPDATE
votes SET lastvoted = CURRENT_TIMESTAMP
现在 this 已被 Apache Derby 接受。但是执行它会导致触发循环,正如 AFTER 所预期的那样。所以,还是没有解决办法。
这是怎么做到的?在其他数据库上非常简单。德比也必须有一个解决方案。
【问题讨论】:
【参考方案1】:确切地说,您必须在表中指定要侦听更新的每个列(显然不包括 lastvoted 列)。
CREATE TRIGGER updateTimestamp
AFTER UPDATE OF col1, col2, col3... ON votes
REFERENCING OLD AS EXISTING
FOR EACH ROW MODE DB2SQL
UPDATE votes SET lastvoted = CURRENT_TIMESTAMP
WHERE pkcolumn = EXISTING.pkcolumn
【讨论】:
【参考方案2】:尝试指定更新的列,它应该可以工作:
在更新已更新列的投票后创建触发器 updateTimestamp REFERENCING OLD AS old FOR EACH ROW MODE DB2SQL UPDATE votes SET lastvoted = CURRENT_TIMESTAMP WHERE yourprimarykeycolumn=old.yourprimarykeycolumn;
【讨论】:
以上是关于Derby Trigger on UPDATE:如何更新时间戳?的主要内容,如果未能解决你的问题,请参考以下文章
sqlserver trigger(触发器)-更新某几列数据时触发