在postgreSQL上插入之前获取函数触发器中新记录的ID

时间:2017-09-26 16:57:08

标签: database postgresql triggers

我正在创建一个函数触发器,它将在某些表中插入新记录之前执行,此函数触发器将新记录插入另一个表中,并带有第一个插入的某些值。我需要在插入之前执行,因为我需要第一个表中的最后一条记录来与新记录的某些字段进行比较。

这里的问题是,我可以找到如何获取将要插入的记录的ID,因为该记录尚不存在。

我在想用户一个序列来获取将要生成的下一个id,但是如果有多个用户同时写入数据库,我不知道这些是否会导致问题。

这是我的函数PostgreSQL函数:

CREATE FUNCTION mydb.mytriggername()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100.0
    VOLATILE NOT LEAKPROOF 
AS $BODY$

BEGIN  
    IF (
        SELECT tvalue FROM mydb.myTable WHERE type = NEW.type AND sb = NEW.sb AND st= NEW.st order by id DESC LIMIT 1
       ) <> NEW.tvalue THEN
        INSERT INTO mydb.anotherTable( type, date, desc, tp, sb, st, ref)
        SELECT 'tc', NEW.date, 'newdesc', NEW.type, NEW.sb, NEW.st, CONCAT('{"id_ref":', NEW.id, '}');
    END IF;

    RETURN NEW;
END;

请注意,我需要在CONCAT('{"id_ref":', NEW.id, '}');上使用它,但正如我之前所说,我没有id,因为它尚未插入新记录。

你有什么方法可以解决我的问题吗?

1 个答案:

答案 0 :(得分:0)

你没有透露你的触发器代码,所以我不确定是这种情况,但下面是在NEW之前使用INSERT

的示例
t=# create table ta1(i int);
CREATE TABLE
t=# create table ta2(i int);
CREATE TABLE
t=# create function taf() returns trigger volatile not leakproof as $$
begin
if NEW.i > 0 then insert into ta2 values (NEW.i); end if;
return NEW;
end;
$$ language plpgsql
;
CREATE FUNCTION
t=# create trigger tg before insert on ta1 for each row execute procedure taf();
CREATE TRIGGER
t=# select * from ta2;
 i
---
(0 rows)

t=# begin; insert into ta1 select 5;
BEGIN
INSERT 0 1
t=# select * from ta2;
 i
---
 5
(1 row)

t=# end;
COMMIT