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

Database 在postgreSQL上插入之前获取函数触发器中新记录的ID,database,postgresql,triggers,Database,Postgresql,Triggers,我正在做一个函数触发器,它将在某个表中插入新记录之前执行,这个函数触发器将使用第一次插入的一些值将新记录插入另一个表中。我需要在insert之前执行,因为我需要第一个表中的最后一条记录与新记录的一些字段进行比较 这里的问题是,我可以找到如何获取要插入的记录的Id,因为该记录还不存在 我认为用户可以使用一个序列来获取将要生成的下一个id,但如果有多个用户同时向数据库写入数据,我不知道这些是否会导致问题 这是我的函数PostgreSQL函数: CREATE FUNCTION mydb.mytrigg

我正在做一个函数触发器,它将在某个表中插入新记录之前执行,这个函数触发器将使用第一次插入的一些值将新记录插入另一个表中。我需要在insert之前执行,因为我需要第一个表中的最后一条记录与新记录的一些字段进行比较

这里的问题是,我可以找到如何获取要插入的记录的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,因为它还没有插入新记录


你有什么办法解决我的问题吗?

你没有透露你的触发代码,所以我不确定情况是否如此,但下面是使用“插入前新建”的示例


看看表是否使用串行文件,在这种情况下,您有一个序列,可以获得下一个值。如果没有,您可以尝试使用maxidYes@Adam,该字段使用的是串行id,我关心的是,如果在第一个事务开始的同一秒中有另一个事务,会发生什么情况。事务是否有可能保存第三条记录的id而不是当前事务?@Adm,似乎工作正常,但当查询返回空结果集时,comparations not works empty resultset NEW。tvalue@Adam,实际上,这种方法存在一个问题,当您执行nextval时,它获取下一个id并将值保存在序列上。因此,当触发器再次执行nextval时,返回的id已不相同。
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