Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function PostgreSQL UPSERT触发器返回id_Function_Postgresql_Triggers_Plpgsql_Upsert - Fatal编程技术网

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
进行定义。