I would like to insert a blank record into a table and have its serial
primary key value update. I would then like to get the new value and insert it into a temporary table. This will take place within a function using language plpgsql
.
So far I have this:
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
The above does not insert anything (I grabbed the solution from a MySQL answer). It returns an error of:
[42601] ERROR: INSERT has more target columns than expressions
Removing the VALUES(NULL);
part does not work either like it does in SQL Server. How can I therefore insert a blank record with only the serial
updating?
Once a new record is generated with a new serial
number, how do I output that back into the temp table?
You don't really need PL/pgSQL for that. If post.postid
really is a serial (an identity
would be better), then the following will work:
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;
However, if this is really inside a PL/pgSQL function, there is no need for a costly temp table:
....
declare
l_postid integer;
begin
insert into post (postid) values (default)
returning postid
into l_postid;
--- work with l_postid
end;
If you only want to increment the column's sequence and you don't really need the new row (which seems likely, given the fact that you don't provide any column values at all), then why don't you simply call nextval()
?
select nextval(pg_get_serial_sequence('post', 'postid'));
In PL/pgSQL you can simply assign that to a variable without the need for a dummy row:
....
declare
l_postid integer;
begin
...
l_postid := nextval(pg_get_serial_sequence('post', 'postid'));
....
end;