Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果子表更新,则更新父表上的时间戳_Php_Mysql_Sql - Fatal编程技术网

Php 如果子表更新,则更新父表上的时间戳

Php 如果子表更新,则更新父表上的时间戳,php,mysql,sql,Php,Mysql,Sql,假设我有一个对开表(id、名称、lastModified) 和子表项目(id、名称、对开本id、lastModified) 如果子表得到更新,我想更新父表的lastModified。我怎样才能自动完成 p、 s.lastModified是一个时间戳,在发生更改时会自动更新。如果希望父级的lastModified始终是所有子级的lastModified的最大值,我建议甚至不要显式存储父级的值,而是通过动态查询子表来获取值。是的,每次都有准确和规范化的数据(并且没有性能破坏触发器)的优点超过了每次查

假设我有一个对开表(id、名称、lastModified)

和子表项目(id、名称、对开本id、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
,等等。