2013-06-21 6 views
3

Я надеялся позвонить NEXTVAL один раз и использовать возвращаемые значения несколько раз. Однако это не сработает.PostgreSQL nextval и currval в одном запросе

Пусть последовательность seq_name находится в 10 сейчас (запросы выполняются независимо друг от друга, а не в указанном порядке):

SELECT NEXTVAL('seq_name'), NEXTVAL('seq_name'); 

выше даст 11, 12 (я хочу, 11 и 11 раз).

SELECT NEXTVAL('seq_name'), CURRVAL('seq_name'); 
SELECT NEXTVAL('seq_name'), LASTVAL(); 

выше даст 11, 10 ИЛИ выдаст ошибку, что NEXTVAL никогда не был вызван в текущей сессии. [Я знаю, почему происходит ошибка :)]

Есть ли способ использовать NEXTVAL и CURRVAL в одном операторе SQL, чтобы получить то же измененное значение (11 в данном случае) для повторного использования? Или простое решение этой проблемы?

ответ

4

Возможное решение

SELECT nextval nextval1, nextval nextval2 
    FROM 
(
    SELECT NEXTVAL('seq_name') nextval 
) q 

Вот SQLFiddle демо.

UPDATE Чтобы вставить вместо INSERT INTO ... VALUES использования INSERT INTO ... SELECT

INSERT INTO Table1 (col1, col2, col3, col4, ...) 
SELECT nextval, nextval, 5, 'Text value', ... 
    FROM 
(
    SELECT NEXTVAL('seq_name') nextval 
) q 
+1

Как насчет 'INSERT() VALUES()' построить? Мне нужно это для такого выражения вставки, поэтому более общее решение было бы подходящим. Ваше решение слишком специфично для операторов SELECT. – ADTC

+0

См. Обновленный ответ – peterm

+0

Спасибо, хороший ответ, но что, если я действительно _really_ *** действительно *** должен придерживаться конструкции INSERT VALUES? : D – ADTC