Function PostgreSQL UPSERT触发器返回id
我在表上有一个Function PostgreSQL UPSERT触发器返回id,function,postgresql,triggers,plpgsql,upsert,Function,Postgresql,Triggers,Plpgsql,Upsert,我在表上有一个UPSERT触发器,在执行插入操作时,该触发器可能会更新而不是插入。我让函数在该表上执行insert,并返回id,但它在更新时不返回id,而不是插入。在这两种情况下我都想得到身份证 触发码 perform 1 from tera_subject where id = new.subject_id and owner = new.user_id; if found then return null; else select id into vote_id from t
UPSERT
触发器,在执行插入操作时,该触发器可能会更新而不是插入。我让函数在该表上执行insert,并返回id
,但它在更新时不返回id,而不是插入。在这两种情况下我都想得到身份证
触发码
perform 1 from tera_subject
where id = new.subject_id and owner = new.user_id;
if found then
return null;
else
select id into vote_id from tera_votes where
user_id = new.user_id and
subject_id = new.subject_id;
if not found then
return new;
else
-- raise notice 'vote_id: % ; vote: %',vote_id,new.vote;
if(tg_op = 'INSERT') then
begin
-- raise notice 'redirecting to update';
update tera_votes
set vote=new.vote
WHERE id = vote_id;
end;
elsif(tg_op = 'UPDATE') then
-- raise notice 'in update';
return new;
end if;
-- raise notice 'end of trigger %',tg_op;
return null;
end if;
end if;
end;
我不认为你会设法让触发器“返回”任何东西 你在里面做的是:
- 根据您的情况运行更新李>
- 正在抑制触发触发器的
语句INSERT
INSERT
以一种简单的方式终止(无一例外),但也意味着无法向您提供任何详细信息,因为触发器函数不返回任何值
如果你需要拥有UpSert项目的ID,请考虑使用一个总是返回ID的函数,比如
< p>我不认为你会设法通过触发器得到任何“返回”。 你在里面做的是:- 根据您的情况运行更新李>
- 正在抑制触发触发器的
语句INSERT
INSERT
以一种简单的方式终止(无一例外),但也意味着无法向您提供任何详细信息,因为触发器函数不返回任何值
如果您需要拥有UpSert ED项的ID,请考虑使用一个函数,该函数将始终返回ID,例如用Trigger Code更新的
。函数只是插入查询,返回的id不是完整的定义,descripe
节丢失。使用触发器代码更新。函数只是插入查询,返回id,看起来不像是完整的定义,描述
部分缺失。我不明白的是循环
在该函数中做了什么?它迭代什么?你不需要这样的循环。该功能的总体思路适合您的需要。如果在该函数中,UPDATE
未找到任何行,并且就在INSERT
之前,并行会话成功插入匹配行,则需要该循环重新发出该语句。无论如何,我保留了该循环,但在loop
附近出现语法错误。您能显示整个循环吗函数定义,从创建
开始,直到最终的代码>,请?这是PL/pgSQL函数,所以您应该使用语言plpgsql
进行定义。我不明白的是循环
在该函数中做了什么?它迭代什么?你不需要这样的循环。该功能的总体思路适合您的需要。如果在该函数中,UPDATE
未找到任何行,并且就在INSERT
之前,并行会话成功插入匹配行,则需要该循环重新发出该语句。无论如何,我保留了该循环,但在loop
附近出现语法错误。您能显示整个循环吗函数定义,从创建
开始,直到最终的代码>,请?这是PL/pgSQL函数,所以您应该使用语言plpgsql
进行定义。