如果在postgresql中创建/更新了一行记录,如何触发另一行记录的创建/更新

如果在postgresql中创建/更新了一行记录,如何触发另一行记录的创建/更新,postgresql,Postgresql,我正在接收外部的csv记录,然后当我在postgresql中创建或更新条目时,我需要创建一个只有符号差异的镜像条目。这是可以在程序级完成的,我很想知道是否可以使用触发器。 对于我能找到的示例,它们都以代码结尾, 对于每一行,执行过程foo() 并通常处理检查,使用NEW.additionalfield添加附加信息,或插入到另一个表中。如果我以这种方式使用触发器在同一个表中插入另一行,那么触发器似乎会再次被触发,并且创建过程变得递归。 有没有办法解决这个问题?在处理触发器时,经验法则是: 如果它根

我正在接收外部的csv记录,然后当我在postgresql中创建或更新条目时,我需要创建一个只有符号差异的镜像条目。这是可以在程序级完成的,我很想知道是否可以使用触发器。 对于我能找到的示例,它们都以代码结尾,
对于每一行,执行过程foo()
并通常处理检查,使用
NEW.additionalfield
添加附加信息,或插入到另一个表中。如果我以这种方式使用触发器在同一个表中插入另一行,那么触发器似乎会再次被触发,并且创建过程变得递归。
有没有办法解决这个问题?

在处理触发器时,经验法则是:

  • 如果它根据某些业务规则或其他(例如添加额外信息或处理计算字段)更改当前行,则它属于触发器之前的

  • 如果它对单独表中的一行或多行有副作用,则它属于
    AFTER
    触发器

  • 如果它对任何其他内置约束(检查、唯一键、外键、排除等)无法处理的表运行完整性检查,则它属于
    约束
    [after]触发器

  • 如果它对同一个表中的一行或多行有副作用,您可能应该重新访问模式、代码流或两者

  • 关于最后一点,Postgres中实际上有一些变通方法,例如尝试获取锁或检查xmin与事务的xid,以避免陷入递归场景。最新版本还引入了
    pg\u trigger\u depth()
    。但我还是反对

    请注意,可以将约束触发器创建为
    可延迟初始延迟
    。这会将约束触发器延迟到事务的最后,而不是紧跟在语句之后

    您的问题和昵称暗示您想知道如何在复式簿记应用程序中自动平衡一组行。假设是这样,不要自动创建平衡条目。相反,开始一个事务,分别输入每一行,并使用一个(对于每一行,可延迟的初始延迟)约束触发器从中提取内容,如果有任何内容不平衡,则拒绝整个批处理。当你想平衡两条或三条以上的线时,这样做会让你省去一大堆头疼的事

    另一种解读可能是您希望创建审计跟踪。如果是这样,请创建其他审核表并使用after触发器填充它们。有多种方法可以创建和管理这些审核表。调查(如果您对表的完整历史记录(包括与其他审核表的关系历史记录)感兴趣,则Fwiw类型6的
    start\u end
    列的类型
    tsrange
    tstzrange
    适用于审核表。),并在需要历史报告时使用审计表