2014-07-03 47 views
0

让我们说我有一个对开表(ID,姓名,上次更改时间)更新时间戳,如果子表得到更新

和子表的文章(ID,姓名,FOLIO_ID,上次更改时间)。

如果子表得到更新,我想更新父表的lastModified。我如何自动完成它?

p.s. lastModified是一个时间戳,在发生更改时会自动更新。

+0

你打算如何更新你的子表?有不同的方法可以完成这个任务,但是我可以想到的是,将更新放入存储过程来更新这两个表或在子表上添加触发器。 – rhealitycheck

+0

@rhealitycheck触发子表是首选,请告知 – user2727195

+0

为什么不尝试阅读文档,看看你是否仍然有问题:http://dev.mysql.com/doc/refman/5.0/en/triggers。 html – rhealitycheck

回答

0

个人而言,我会从我的应用程序代码中处理这个..

但是你可以使用触发器来完成这项工作,只需在更新记录时创建一个触发器;

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 
+0

此SQL Server语法。 MySQL的语法有些不同。即在标识符周围使用反引号(不是方括号),包括“FOR EACH ROW”,对修改值的引用等。 folio_id列将为** NEW.folio_id **等。 – spencer7593

0

如果你想父母的上次更改时间永远是所有儿童的上次更改时间的最大值,我会建议不是偶存贮父价值明确,并通过动态查询子表,而不是获得的价值。 是的,每次都有具有准确和标准化的数据(并且没有性能查杀触发器)的优点胜过每次查询子表的缺点(假设您有父/子,索引等的外键)。

例如,如果你这样做,表达父表的另一种方法是:

create view vFolio as 
select id, name, lastModified=(
        select max(a.lastModified) 
        from article a where a.folio_id = f.id 
       ) 
from folio f 
+0

如果没有孩子会怎么样? –

+0

如果您希望Folio具有lastModified(即使没有文章),那么我会在作品集上放置一个createDate,然后使用动态拉动的lastModified = isnull(,createDate)。请注意,在这种情况下,Folio上的日期字段并不会重新创建原始问题 - 这是一个不同的字段,其意义不同,而这种字段碰巧有相似的用处。 – SlimsGhost

+0

如果父代也可更新,该怎么办?如果您更改父行中的列,则无法确定是否更新或未使用您的方法。 –