gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:47:09 31 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

关于database - 在 postgreSQL 上插入之前获取函数触发器中新记录的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46432022/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com