Re: updating sequence value for column 'serial'
От | Adrian Klaver |
---|---|
Тема | Re: updating sequence value for column 'serial' |
Дата | |
Msg-id | 3d189c7f-2e45-a1a4-fc53-5dff1d364540@aklaver.com обсуждение исходный текст |
Ответ на | Re: updating sequence value for column 'serial' (Matthias Apitz <guru@unixarea.de>) |
Ответы |
Re: updating sequence value for column 'serial'
|
Список | 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 по дате отправления: