recusive function postgres获取最新ID

时间:2016-07-27 11:03:23

标签: postgresql function recursion triggers coalesce

我想在Postgresql中使用一个函数来获取与历史相关的最新ID:

CREATE TABLE "tbl_ids" (
 "ID" oid,
 "Name" text,
 "newID" oid
);

创建这个简单的表后,我不知道从哪里开始我的功能,在你问之前:我知道COALESCE() - 函数,但是我将来会有更多的父ID。 ..

CREATE FUNCTION get_lastes_id(ID oid, newID oid) RETURNS oid AS $$
 BEGIN
  IF new IS NOT NULL THEN
   --USE old--      
  END
  IF new IS NULL THEN
   get_latest_id(new, "newID")
  END
END;

我必须说出来,因为无论如何你都会发现:我是Postgresql函数的新手,我甚至不确定这是否可行。但假设COALESCE() - 函数也存在,它必须是服务器端函数我想:/

1 个答案:

答案 0 :(得分:0)

首先,目前尚不清楚你在问什么。 oid可能不是最好使用的类型,因为它们是为系统库设计的内部类型,因此你不能保证它们会以你期望的方式运行。

其次,如果您想使用递归来获取最新信息,那么在我看来这是一个糟糕的选择工具。如果您希望事情表现良好,请尝试在集合操作中思考,而不是考虑不确定的算法。

如果您想要一个触发器来获取名称的最新(最大)oid并将其分配给“newID”,那么:

CREATE OR REPLACE FUNCTION set_newID() RETURNS TRIGGER LANGUAGE PLPGSQL AS
$$
DECLARE maxid oid;
BEGIN
    IF new."newID" IS NOT NULL THEN
          RETURN new; -- do nothing
    END IF;
    SELECT max("ID") INTO maxid FROM tbl_ids WHERE "Name" = new."Name";
    new."newID" = maxid;
    RETURN new;
END;    
$$;

适用于oid和int。但是,它必须在触发器修改的每一行上从数据库中选择一行,以便您在批量插入时遇到性能问题。

哦,使用全部小写更好,所以你不必引用每个标识符。