From: | Thomas Kellerer <shammat(at)gmx(dot)net> |
---|---|
To: | pgsql-general(at)lists(dot)postgresql(dot)org |
Subject: | Re: checking existence of a table before updating its SERIAL |
Date: | 2020-06-08 08:18:41 |
Message-ID: | 3be8b9bc-70ce-ed6b-c47b-0544e42be925@gmx.net |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
Matthias Apitz schrieb am 08.06.2020 um 09:53:
> We're updating the SERIAL of a bunch of tables with a SQL script which
> does for any table:
>
> /* table: idm_tasktab */
> DO $$
> DECLARE
> max_id int;
> BEGIN
> SELECT INTO max_id GREATEST(COALESCE(max(taskid), 0),0) + 1 FROM idm_tasktab;
> RAISE NOTICE '% % %', 'idm_tasktab', 'taskid', max_id ;
> EXECUTE 'ALTER SEQUENCE idm_tasktab_taskid_seq RESTART ' || max_id::text;
> END $$ LANGUAGE plpgsql;
>
> Can some kind soul help me with doing a test for the existence of the
> table to avoid the error message about non existing relation?
I think the easiest way is to use to_regclass():
DO $$
DECLARE
max_id int;
BEGIN
if to_regclass('idm_tasktab') is not null then
SELECT INTO max_id GREATEST(COALESCE(max(taskid), 0),0) + 1 FROM idm_tasktab;
RAISE NOTICE '% % %', 'idm_tasktab', 'taskid', max_id ;
EXECUTE 'ALTER SEQUENCE idm_tasktab_taskid_seq RESTART ' || max_id::text;
end if;
END $$ LANGUAGE plpgsql;
Note that you don't really need dynamic SQL for this, you can simplify this to:
select setval('idm_tasktab_taskid_seq', GREATEST(COALESCE(max(taskid), 0),0))
from idm_tasktab;
I also don't think greatest() is necessary.
Thomas
From | Date | Subject | |
---|---|---|---|
Next Message | Oleksandr Shulgin | 2020-06-08 08:40:15 | Re: When to use PARTITION BY HASH? |
Previous Message | Thorsten Schöning | 2020-06-08 08:14:09 | Concurrenctly running CREATE TEMP TABLE IF NOT EXISTS [...] AS [...] |