Иногда нужно выполнить несколько SQL - команд подряд, например в блоке транзакции BEGIN - COMMIT и хочется чтобы поток выполнения не прерывался. Но что делать, если требуется включить в цепочку команду SELECT?
Делаем молчаливый SELECT, не прерывающий поток выполнения команд:
BEGIN;
-- ...
UPDATE mytbl SET id = 0 WHERE id IN ( -- mute select
-- наш select
SELECT SETVAL('mytbl_id_seq', (SELECT MAX(id)+1 FROM mytbl), FALSE)
);
-- ...
COMMIT;
Помещаем его для этого в условие апдейта и делаем, чтобы оно никогда не выполнилось.
В данном случае мы селектом ставим номер следующий за максимальным существующим, и его возвращаем. Соответственно, обновить запись с таким id невозможно, т.к. её нет, но и результат селекта не возвращается. И выполняется следующая инструкция SQL, чего мы и добивались.