如何插入一个空行,但串行更新正确?
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;
我想将一条空白记录插入 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;