2013-09-09 2 views
2

Я использую PostgreSQL 8.2 (это должна быть минимальная версия, поддерживающая RETURNING), точно 8.2.19 на GNU/Linux. Я попытался использовать предложение return на автоматически вставленном столбце, который также ограничен как первичный ключ. Ввод новой строки правильно завершен, но возвращаемый результат пуст (проверен с помощью запроса executer в pgAdmin). Я попробовал неявное вложение, а также задал значение DEFAULT для столбца первичного ключа.Как использовать предложение RETURNING в PostgreSQL?

В колонке я попытался вернуться определяется как

al_id integer NOT NULL DEFAULT nextval(('"allarmi_al_id_seq"'::text)::regclass) 

и запрос вставки, как

INSERT INTO alarms (al_id, al_descr) 
    VALUES (DEFAULT, 'description') 
    RETURNING al_id; 

allarmi_al_id_seq, очевидно, (?) Последовательность и определяется как

CREATE SEQUENCE allarmi_al_id_seq 
    INCREMENT 1 
    MINVALUE 1 
    MAXVALUE 9223372036854775807 
    START 34564230 
    CACHE 1; 

Что случилось?

+0

похоже, что он работает в 8.3.20 - http://sqlfiddle.com/#!10/309b9/1. Должно быть какое-то исправление между этими двумя версиями :) –

+0

Пробовал ли вы это, не объясняя al_id? http://sqlfiddle.com/#!10/309b9/4 –

+0

Да, я имел в виду именно этот стиль, говорящий «неявная вставка» –

ответ

1

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

INSERT INTO alarms (al_id, al_descr) 
    VALUES (DEFAULT, 'description') 
    RETURNING currval('allarmi_al_id_seq') AS al_id; 

Обратите внимание, что CURRVAL функция возвращает последнее полученное значение в этой сессии, так что нет никаких проблем параллелизма (если у вас нет триггера, который заставляет последовательность увеличиваться).