Re: updating sequence value for column 'serial' - Mailing list pgsql-general

From Adrian Klaver
Subject Re: updating sequence value for column 'serial'
Date
Msg-id 3d189c7f-2e45-a1a4-fc53-5dff1d364540@aklaver.com
Whole thread Raw
In response to Re: updating sequence value for column 'serial'  (Matthias Apitz <guru@unixarea.de>)
Responses Re: updating sequence value for column 'serial'
List pgsql-general
On 9/24/19 10:40 PM, Matthias Apitz wrote:
> El día martes, septiembre 24, 2019 a las 08:01:46a. m. -0700, Adrian Klaver escribió:
> 
>> On 9/24/19 7:47 AM, Matthias Apitz wrote:
>>>
>>> Hello,
>>>
>>> We have in a database some 400 tables, 75 of them have a 'serial'
>>> column, like the one in the example table 'titel_daten', column 'katkey'.
>>>
>>> I want to create a SQL script to adjust alls these sequences to the
>>> max+1 value in its column after loading the database from CSV file.
>>> I found no other way as the code below (the RAISE NOTICE is
>>> only for test at the moment and the output is correct for this table,
>>> i.e current max in 'katkey' is 330721):
>>>
>>> sisis=# DO $$
>>> sisis$# DECLARE
>>> sisis$#    maxikatkey integer := ( select max(katkey) from titel_daten );
>>> sisis$#    result integer := 1;
>>> sisis$# BEGIN
>>> sisis$#    maxikatkey := maxikatkey +1;
>>> sisis$#    RAISE NOTICE '%', maxikatkey ;
>>> sisis$#    result := (SELECT SETVAL('titel_daten_katkey_seq', maxikatkey) );
>>> sisis$#    RAISE NOTICE '%', result ;
>>> sisis$# END $$;
>>> NOTICE:  330722
>>> NOTICE:  330723
>>> DO
>>>
>>> Is there any better way? Thanks
>>
>> I have not found a better way. I use ALTER SEQUENCE .. RESTART 330722
>> though:
> 
> Yes, but I found no way to use a variable like 'maxikatkey' in the ALTER SEQUENCE ...
> it only excepts digits like 330722.

DO $$
DECLARE
     max_id int;
BEGIN
     SELECT INTO max_id max(id) + 1 FROM seq_test;
     RAISE NOTICE 'Max id is %', max_id;
     EXECUTE 'ALTER SEQUENCE seq_test_id_seq RESTART ' || max_id::text;
END;
$$ LANGUAGE plpgsql;

> 
> Sometimes, when the table has no rows for example, the SELECT MAX(...) FROM ...
> returns <NULL>. I'm surprised about that even maxikatkey := maxikatkey +1; does
> not set it to 1 'maxikatkey'. Should I worry about this in SELECT SETVAL(...) or can
> I make it somehow to 1 or 0?

It's just going to leave it where it is:

test=# create sequence test_seq;
CREATE SEQUENCE
test=# select * from test_seq ;
  last_value | log_cnt | is_called
------------+---------+-----------
           1 |       0 | f
(1 row)

test=# SELECT SETVAL('test_seq', NULL);
  setval
--------
    NULL
(1 row)

test=# select * from test_seq ;
  last_value | log_cnt | is_called
------------+---------+-----------
           1 |       0 | f
(1 row)

test=# SELECT SETVAL('test_seq', 15);
  setval
--------
      15
(1 row)

test=# SELECT SETVAL('test_seq', NULL);
  setval
--------
    NULL
(1 row)

test=# select * from test_seq ;
  last_value | log_cnt | is_called
------------+---------+-----------
          15 |       0 | t
(1 row)

> 
>     matthias
> 


-- 
Adrian Klaver
adrian.klaver@aklaver.com



pgsql-general by date:

Previous
From: Tom Lane
Date:
Subject: Re: Mapping view columns to their source columns
Next
From: Rob Sargent
Date:
Subject: Re: managing primary key conflicts while restoring data to table with existing data