Выберите несколько идентификаторов из последовательности PostgreSQL.
Существует ли краткий способ выбора nextval для последовательности PostgreSQL несколько раз в 1 запросе? Это будет единственное возвращаемое значение.
Например, я хотел бы сделать что-то действительно короткое и сладкое:
SELECT NEXTVAL('mytable_seq', 3) AS id;
И получим:
id
-----
118
119
120
(3 rows)
Ответы
Ответ 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, но я не могу публиковать ссылки.