Php 如果子表更新,则更新父表上的时间戳
假设我有一个对开表(id、名称、lastModified) 和子表项目(id、名称、对开本id、lastModified) 如果子表得到更新,我想更新父表的lastModified。我怎样才能自动完成Php 如果子表更新,则更新父表上的时间戳,php,mysql,sql,Php,Mysql,Sql,假设我有一个对开表(id、名称、lastModified) 和子表项目(id、名称、对开本id、lastModified) 如果子表得到更新,我想更新父表的lastModified。我怎样才能自动完成 p、 s.lastModified是一个时间戳,在发生更改时会自动更新。如果希望父级的lastModified始终是所有子级的lastModified的最大值,我建议甚至不要显式存储父级的值,而是通过动态查询子表来获取值。是的,每次都有准确和规范化的数据(并且没有性能破坏触发器)的优点超过了每次查
p、 s.lastModified是一个时间戳,在发生更改时会自动更新。如果希望父级的lastModified始终是所有子级的lastModified的最大值,我建议甚至不要显式存储父级的值,而是通过动态查询子表来获取值。是的,每次都有准确和规范化的数据(并且没有性能破坏触发器)的优点超过了每次查询子表的缺点(假设父/子表、索引等都有外键) 例如,如果这样做,表示父表的另一种方法是:
create view vFolio as
select id, name, lastModified=(
select max(a.lastModified)
from article a where a.folio_id = f.id
)
from folio f
就我个人而言,我会在我的申请代码中处理这个问题 然而,您可以使用触发器来完成这项工作,只需在执行记录更新时创建一个触发器
CREATE TRIGGER [dbo].[tr_childupdate]
ON [dbo].[childtable]
AFTER UPDATE
AS BEGIN
..... code to update parent table..
WHERE dbo.folio.id = updated.folio_id
END
您计划如何更新您的子表?有不同的方法可以实现这一点,但我能想到的一些方法是将更新放在存储过程中,以更新两个表,或者在子表上有一个触发器。@首选子表上的rhealitycheck触发器,请建议您为什么不尝试阅读文档,看看您是否还有问题:实际上这有更多的代码示例:@user272195:请注意,“child”表
文章
上的触发器将不起作用(并且会引发错误)如果UPDATE
语句对article
中的行执行了UPDATE
语句,如果UPDATE
语句也引用了“parent”folio
表,那么如果没有子对象呢?如果您希望folio有一个lastModified,即使没有文章,我也会在folio上放置一个createDate,然后动态提取lastModified=isnull(,createDate)。请注意,在这种情况下,对开本上的日期字段不会重新创建原始问题-它是一个具有不同含义的不同字段,恰好以类似的方式有用。如果父字段也是可更新的呢?如果您更改父行中的一列,则无法判断该列是否已更新或未使用您的方法。@KeremBaydoğan-那么这将改变问题陈述,不是吗?虽然OP甚至没有涉及您提到的要求,但您肯定可以有一个case
语句来检查父对象自己的lastModifiedDate
,并将其与所有子对象的lastModifiedDate
值进行比较,并获取最新值。随着问题的变化,解决方案也会发生变化……这样,你就会有不一致的行为。如果在不使用join的情况下执行select查询,则会得到一个“lastModifiedDate”,它与使用join得到的查询不同。这些值代表不同的逻辑,因此它们应该有自己的独立列,如“selfUptadedAt”和“childUpdatedAt”。这是SQL Server语法。MySQL的语法有点不同。i、 e.在标识符周围使用反勾号(不是方括号),包括每行的,对修改后的值的引用,例如对开本id
列将是新的。对开本id
,等等。