2011-03-16 42 views
1

表:具有列Start_Time和End_Time的客户。帮助使用同一个表的其他列更新列

我需要添加一个新的列“持续时间”,即End_Time - Start_Time。 但是,我需要使用触发器或过程来做到这一点,以便在向Customer表添加新记录后立即更新列Duration。

+0

您是否在问如何设置触发器,或者如何添加列,或者如何编写查询来设置新列的值? – 2011-03-16 03:40:11

+1

为什么你希望在表格中添加一个计算列?任何查询都可以得到它。或者,你可以创建一个视图来获得持续时间。 – Kangkan 2011-03-16 04:02:36

回答

3

如果您使用MS SQL,理想的答案可能是计算列

实际复制的数据越少,数据不一致的机会越少,因此您的模式会导致一致性确保/验证代码越少,维护流程越少。为了进行设置(再次使用MS SQL),只需使用设计器添加另一列,然后展开“计算列说明”区域即可。 (您可以参考此表中的其他列进行此计算。)然后输入“End_Time - Start_Time”。取决于您要对此数据执行的操作,可能需要为公式使用DATEDIFF(分钟,开始时间,结束时间)等内容。这正是这个功能的用途。

如果这是一个非常昂贵的计算(根据您提供的信息,您的计算可能不是这样),您可以将结果配置为“持续” - 这非常类似触发器,但更易于实施和维护。

或者,您可以创建一个新的视图来执行相同的计算,并在获取信息时通过它“投影”第一个表。但你可能已经知道了,这个答案就此诞生了! :)

p.s.我个人建议避免像鼠疫这样的触发器。它们会导致开发人员,维护人员或管理员通常不期望的额外操作。这可能会导致操作失败,返回意外的额外结果集或修改管理员可能特别试图避免在管理期间修改的行(请参阅:不支持的grin)修复。

p.p.s.在这种情况下,我也建议针对存储过程,出于与触发器相同的维护原因。虽然可以限制安全性,以便更新表的唯一方法是通过存储过程,但由于触发器可能会失败的许多相同原因,这可能会失败。如果可以,最好避免重复数据。

p.p.p.s :)这并不是说存储过程整体上不好。对于复杂的事务操作或对大型相关表进行紧密集成的过程过滤以返回相对较小的结果集,它们通常仍是最佳选择。

+0

非常感谢:D – indolent 2011-03-16 04:58:31

3

按照shannon的说法,虽然oracle中的术语是“Virtual Column” 有11g的增强。在此之前,使用一个视图(并且这仍然是11g的潜在答案)。

请勿使用触发器或存储过程。

相关问题