创建触发器,将数据从一个表复制到postgresql中动态生成的表

时间:2017-03-16 06:54:42

标签: java postgresql function triggers

我必须简单地将数据从一个表复制到动态生成的表中。我创建了触发器..

CREATE  OR  REPLACE FUNCTION  historylogfunc() RETURNS TRIGGER AS $example_table$    
   DECLARE last_device_id text;
   BEGIN
        PERFORM last_device_id = device_id FROM company ORDER BY id DESC LIMIT 1;        
    INSERT INTO "device_id"(emp_id, entry_date, name) VALUES (new.id,  current_timestamp,  new.name);
        RETURN NEW;
    END;
$example_table$ LANGUAGE plpgsql;

PERFORM last_device_id = device_id FROM company ORDER BY id DESC LIMIT 1; 

它将从表中选择最后device_id并存储在var last device_id中 假设device_id = dv001

我必须将数据从主表复制到新表,即dv001。

错误显示:关系" device_id"不存在。

请帮帮我......

1 个答案:

答案 0 :(得分:0)

我发现你的功能存在两个问题:

  1. PERFORM last_device_id = device_id FROM company ORDER BY id DESC LIMIT 1;

    • 这与SELECT last_device_id = device_id FROM company ...;相同,只是结果被丢弃。 所以这句话什么都不做,因为它没有副作用。这不是故意的。

    • SELECT last_device_id = device_id ...的(已弃用)结果是比较运算符boolean的{​​{1}}结果。那是你的意图吗?

  2. =

    这会导致错误消息,因为没有名为INSERT INTO "device_id"(emp_id, entry_date, name) VALUES (new.id, current_timestamp, new.name);的表。你确定有这个名字的表吗?然后,如果它不在device_id中,您可能必须使用模式名称对其进行限定。 但是search_path看起来更像是列名而不是表名。

  3. 根据您的评论如下:

    如果您希望将device_id放入名称为INSERT中最新device_id条目的表中,则必须使用如下的动态SQL:

    company