如何插入一个空行,但串行更新正确?

How do I insert an empty row, but have the serial update correctly?

我想将一条空白记录插入 table 并更新其 serial 主键值。然后我想获取新值并将其插入临时 table。这将在使用语言 plpgsql.

的函数中发生

到目前为止我有这个:

CREATE TEMP TABLE _InsertedpostID ( -- to store inserted postid
        postid int
    );

    INSERT INTO post
    (
        postid, --serial which needs to be held in the temp table above
        title,
        location
    )
    VALUES(NULL);

    --- here I need to get the just inserted postid serial and put it into the _InsertedpostID table

上面没有插入任何内容(我从 MySQL 答案中获取了解决方案)。它 returns 错误:

[42601] ERROR: INSERT has more target columns than expressions

删除 VALUES(NULL); 部分不像在 SQL 服务器中那样有效。因此,我怎样才能插入一条只有 serial 更新的空白记录?

使用新 serial 编号生成新记录后,如何将其输出回临时 table?

因为你会创建一个我已经为你创建的功能。

请检查并告诉我。

CREATE TABLE post (
    postid serial, --post_postid_seq will be auto generated
    title text,
    "location" text
);

CREATE TEMP TABLE _InsertedpostID ( -- to store inserted postid
    postid int
);

CREATE OR REPLACE FUNCTION public.InsertAndReturnID()
RETURNS void
LANGUAGE plpgsql
AS $function$
declare
    id integer:=0;
begin
    insert into post(postid) values(default);
    id:=(select currval('post_postid_seq')::integer);
    insert into _InsertedpostID(postid) values(id);
end;
$function$
;

你真的不需要 PL/pgSQL。如果 post.postid 真的是一个连续剧(identity 会更好),那么下面的方法就可以了:

create temp table _insertedpostid (
    postid int
);

with new_post as (
  insert into post (postid)
  values(default)
  returning postid
)
insert into _insertedpostid (postid)
select postid
from new_post;

但是,如果这确实在 PL/pgSQL 函数内部,则不需要昂贵的临时文件 table:

....
declare
  l_postid integer;
begin
  insert into post (postid) values (default)
  returning postid
  into l_postid;
  
  --- work with l_postid
end;

如果您只想增加列的顺序而您并不真正需要新行(考虑到您根本不提供任何列值的事实,这似乎很可能),那为什么不呢你只需调用 nextval()?

 select nextval(pg_get_serial_sequence('post', 'postid'));

在 PL/pgSQL 中,您可以简单地将其分配给变量而无需虚拟行:

....
declare
  l_postid integer;
begin
  ...
  l_postid := nextval(pg_get_serial_sequence('post', 'postid'));
  ....
end;