Search Postgresql Archives

Re: updating sequence value for column 'serial'

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxxx





[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]

  Powered by Linux