【问题标题】:Help updating a column using other columns of the same table帮助使用同一表的其他列更新列
【发布时间】:2011-07-16 07:10:23
【问题描述】:

表:具有 Start_Time 和 End_Time 列的客户。

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

【问题讨论】:

  • 您是问如何设置触发器,或者如何添加列,或者如何编写查询来设置新列的值?
  • 为什么要在表本身中添加计算列?任何提出查询的人都可以得到它。或者更确切地说,您可以创建一个具有持续时间的视图。

标签: sql oracle stored-procedures triggers


【解决方案1】:

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

您实际复制的数据越少,发生数据不一致的机会就越少,因此您的架构将产生更少的一致性确保/验证代码和更少的维护过程。

要设置它(同样,如果使用 MS SQL),只需使用设计器添加另一列,然后展开“计算列规范”区域。 (您可以参考同一表中的其他列进行计算。)然后输入“End_Time - Start_Time”。根据您要对这些数据执行的操作,您可能希望对公式使用类似 DATEDIFF(minute, Start_Time, End_Time) 的内容。这正是此功能的用途。

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

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

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

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

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

【讨论】:

    【解决方案2】:

    根据 shannon,虽然 oracle 中的术语是“Virtual Column” 有 11g 的增强。在此之前,使用视图(这仍然是 11g 的潜在答案)。

    不要使用触发器或存储过程。

    【讨论】:

      猜你喜欢
      • 2012-04-20
      • 2016-10-14
      • 2015-05-19
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 2022-01-14
      • 1970-01-01
      • 2019-07-13
      相关资源
      最近更新 更多