0

我想在表中插入一条空白记录并serial更新其主键值。然后我想获取新值并将其插入临时表中。这将发生在使用语言的函数中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 答案中获取了解决方案)。它返回一个错误:

[42601] 错误:INSERT 的目标列多于表达式

删除VALUES(NULL);部件也不能像在 SQL Server 中那样工作。因此,我怎样才能插入一个只有serial更新的空白记录?

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

4

2 回答 2

1

因为您将创建一个我为您创建的函数。

请检查并让我知道。

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$
;
于 2021-01-16T05:19:52.100 回答
1

你真的不需要 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 函数中,则不需要昂贵的临时表:

....
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;
于 2021-01-16T08:40:35.457 回答