Re: Odd behavior with 'currval'

Поиск
Список
Период
Сортировка
От Melvin Davidson
Тема Re: Odd behavior with 'currval'
Дата
Msg-id CANu8Fix3T3np-_dLnzTPRDeDjB5LeOwX_U79DC_6YjgThKQ9jQ@mail.gmail.com
обсуждение исходный текст
Ответ на Re: Odd behavior with 'currval'  (Adrian Klaver <adrian.klaver@aklaver.com>)
Ответы Re: Odd behavior with 'currval'  (Melvin Davidson <melvin6925@gmail.com>)
Re: Odd behavior with 'currval'  (Steven Hirsch <snhirsch@gmail.com>)
Список pgsql-general


On Thu, Feb 8, 2018 at 1:09 PM, Adrian Klaver <adrian.klaver@aklaver.com> wrote:
On 02/08/2018 09:58 AM, Steven Hirsch wrote:
On Thu, 8 Feb 2018, Francisco Olarte wrote:

Something must be different. As requested by others, try posting the
SQL code chunks, more eyeballs make bugs shallower ( it's happened
several times to me, make a typo, go over it for half an hour, grab a
colleague, she immediately points to it )

Fair enough.  Here is the DDL:

CREATE TABLE udm_asset_type_definition (
   def_id BIGSERIAL NOT NULL,
   def_name VARCHAR(32) NOT NULL,
   PRIMARY KEY (def_id)
);

When I look at the column definition, I see:

nextval('udm_asset_type_definition_def_id_seq'::regclass)

When I look at the catalog, I can see a sequence:

udm_asset_type_definition_def_id_seq

That appears identical to the column default definition and it has the expected 'last_value'.

Here's the odd part: If I issue

SELECT pg_get_serial_sequence('udm_asset_type_definition','def_id')

What if you do?:

SELECT * FROM udm_asset_type_definition_def_id_seq;

SELECT currval('udm_asset_type_definition_id_seq');


Also what happens if you do:

pg_dump -d db_name -U some_user -s  -t udm_asset_type_definition > out.sql



I get back NULL (doesn't matter if I qualify with schema - everything is in a schema called 'main' and that is first on the search path).  All other sequences in the database (created exactly the same way, through definition as 'BIGSERIAL' type) are properly found.

On a hunch, I tried 'SELECT currval(NULL)' to see if it returned '0', but that too returns NULL.  So, where is the '0' coming from when I do:

SELECT currval( pg_get_serial_sequence('udm_asset_type_definition','def_id'))

? I've already established that the inner expression evaluates to NULL!

It shouldn't be, this I why several perople are requesting to see the
relevant code. Experience says lots of this fails are pilot error.

As an aside, with recent postgres versions you can normally use the
returning construct to grab autogenerated id. I.e., instead of "insert
blah-blah-blah, select currval(), whatever else" you can many times do
"insert balh-blah-blah returning auto_gen_column, whatever else". I've
used it a lot, and normally leads to shorter/easier/faster code.

Yes, I changed the code to 'INSERT .. RETURNING ..' and that works correctly.  But, again, not necessary for any of the other tables.

This problem is not a transient fluke - I can reproduce it in two different databases on different servers that were created with the same DDL.



--
Adrian Klaver
adrian.klaver@aklaver.com


I believe your problem is in your usage.
In order for currval(regclass) to work, you must first do a
SELECT nextval(regclass) in your _current transaction_!

https://www.postgresql.org/docs/9.6/static/functions-sequence.html

Function             Return Type     Description
currval(regclass)     bigint             Return value most recently obtained with nextval for specified sequence

--
Melvin Davidson
I reserve the right to fantasize.  Whether or not you
wish to share my fantasy is entirely up to you.

В списке pgsql-general по дате отправления:

Предыдущее
От: Adrian Klaver
Дата:
Сообщение: Re: 回复:there is a great difference between the query execution time and the log record time
Следующее
От: Steven Hirsch
Дата:
Сообщение: Re: Odd behavior with 'currval'