Подтвердить что ты не робот

Выберите несколько идентификаторов из последовательности PostgreSQL.

Существует ли краткий способ выбора nextval для последовательности PostgreSQL несколько раз в 1 запросе? Это будет единственное возвращаемое значение.

Например, я хотел бы сделать что-то действительно короткое и сладкое:

SELECT NEXTVAL('mytable_seq', 3) AS id;

И получим:

 id  
-----
 118
 119
 120
(3 rows)
4b9b3361

Ответ 1

select nextval('mytable_seq') from generate_series(1,3);

generate_series - это функция, которая возвращает много строк с последовательными номерами, настроенными с помощью аргументов.

В приведенном выше примере нам не важно значение в каждой строке, мы просто используем gener_series в качестве генератора строк. И для каждой строки мы можем вызвать nextval. В этом случае он возвращает 3 числа (очередности).

Вы можете обернуть это в функцию, но я не уверен, действительно ли это понятно, насколько короткий запрос.

Ответ 2

Существует большая статья об этой точной проблеме: " получение нескольких значений из последовательностей".

Если производительность не является проблемой, например, при использовании значений последовательности dwarfs время, затрачиваемое на их получение, или n мало, то подход SELECT nextval ('seq') FROM generate_series (1, n) является самым простым и наиболее подходящий.

Но при подготовке данных для объемных нагрузок целесообразно использовать последний подход из статьи приращения последовательности по n из блокировки.

Ответ 3


CREATE OR REPLACE FUNCTION foo() RETURNS SETOF INT AS $$
DECLARE
    seqval int; x int;
BEGIN
x := 0;

WHILE x < 100 LOOP
    SELECT into seqval nextval('f_id_seq');
    RETURN NEXT seqval;
    x := x+1;
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql STRICT;

Конечно, если все, что вы пытаетесь сделать, это продвинуть последовательность, setval().

Вы также можете использовать функцию для определения количества циклов для цикла:

CREATE OR REPLACE FUNCTION foo(loopcnt int) RETURNS SETOF INT AS $$
DECLARE
    seqval int;       
    x int;
BEGIN
x := 0;
WHILE x < loopcnt LOOP
    SELECT into seqval nextval('f_id_seq');
    RETURN NEXT seqval;x := x+1;
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql STRICT;

Ответ 4

Мое лучшее решение:

SELECT NEXTVAL('mytable_seq') AS id
UNION ALL
SELECT NEXTVAL('mytable_seq') AS id
UNION ALL
SELECT NEXTVAL('mytable_seq') AS id;

Что будет правильно возвращать 3 строки... но мне бы хотелось что-то минимальное SQL для даже 100 или более вызовов NEXTVAL.

Ответ 5

Если вы действительно не хотите вернуть три строки, я бы установил последовательность "INCREMENT BY 3" для каждого выбора. Затем вы можете просто добавить 1 и 2 к результату, у вас есть три номера последовательности.

Я попытался добавить ссылку на документы postgresql, но я не могу публиковать ссылки.