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

YAML, по той простой причине, что он делает для очень удобочитаемых файлов конфигурации по сравнению с XML.

XML:


    Bob
    Abooey
    adv
    555-1212
    
ahunter@example1.com
babooey@example2.com

YAML:

    babooey:
        computer : cpu1
        firstname: Bob
        lastname: Abooey
        cell: 555-1212
        addresses:
            - address: babooey@example1.com
              password: xxxx
            - address: babooey@example2.com
              password: xxxx

Примеры были взяты с этой страницы: http://www.kuro5hin.org/story/2004/ 10/29/14225/062

20
задан Mike Stone 21 May 2009 в 16:47
поделиться

5 ответов

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

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

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

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

44
ответ дан 17 October 2019 в 03:22
поделиться

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;

Of course, if all you're trying to do is advance the sequence, there's setval().

You could also have the function take a parameter for how many times to loop:

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;
1
ответ дан 17 October 2019 в 03:22
поделиться

My current best solution is:

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

Which will correctly return 3 rows... but I would like something that is minimal SQL for even as much as 100 or more NEXTVAL invocations.

0
ответ дан 17 October 2019 в 03:22
поделиться

Вот отличная статья об этой конкретной проблеме: « получение нескольких значений из последовательностей ».

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

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

12
ответ дан 17 October 2019 в 03:22
поделиться

Если вы действительно не хотите, чтобы возвращались три строки, я бы установил последовательность как 'УВЕЛИЧЕНИЕ НА 3 'для каждого выбора. Затем вы можете просто добавить 1 и 2 к результату, чтобы у вас были три порядковых номера.

Я пытался добавить ссылку на документы postgresql, но, похоже, мне не разрешено публиковать ссылки.

0
ответ дан 17 October 2019 в 03:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: