在postgres规则中使用变量

时间:2016-12-27 17:48:32

标签: sql postgresql sql-insert

在postgres规则(https://www.postgresql.org/docs/current/static/sql-createrule.html)中,是否可以使用变量?例如,如果我在规则中

CREATE RULE "_RETURN" AS
    ON INSERT TO t1
    DO INSTEAD
        INSERT INTO t1 (id, a) VALUES (uuid_generate_v4(), new.a)
        INSERT INTO t4 (id) VALUES (??????)

我可以以某种方式将第一个INSERT中uuid_generate_v4()的值设置为变量,以便我可以在第二个INSERT中使用它吗?或者有没有办法从第一个INSERT中获取生成id,以便在第二个中使用它?

我也收到错误infinite recursion detected in rules for relation。可能是因为规则是针对表t1但它包含要插入到t1的语句。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

  

此外,我在规则中检测到错误无限递归   关系。可能是因为规则是针对表t1但它包含一个   要插入到t1的语句。我该如何开展这项工作

无法正常工作 请参阅文档:39.4. Rules on INSERT, UPDATE, and DELETE

  

从规则操作生成的查询树被抛入   再次重写系统,可能会有更多的规则被应用   或多或少的查询树。 所以规则的行动必须要么a   与规则不同的命令类型或不同的结果关系   本身是打开的,否则这个递归过程将最终出现在   无限循环。(将检测到规则的递归扩展   报告为错误。)

换句话说,在规则ON INSERT TO t1中,您无法将另一个insert发送到同一个表t1,因为这会导致规则将再次以递归方式触发,再次 - 这将导致错误。

您需要使用触发器完成此任务。