2 окт. 2014 г.

Молчаливый SELECT

Иногда нужно выполнить несколько 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, чего мы и добивались.