Как получить значение автоматически сгенерированных полей с помощью Postgresql? - PullRequest
0 голосов
/ 14 июля 2009

У меня есть таблица postgres, как это:

CREATE SEQUENCE seq;
CREATE TABLE tbl (id INTEGER DEFAULT VALUE nextval('seq'), data VARCHAR);

Когда я вставляю в таблицу:

INSERT INTO tbl (data) VALUES ('something');

Как мне вернуть значение поля id для только что созданной записи?

(Обратите внимание, возможно, я немного отключил синтаксис SQL; суть должна быть ясной)

Предположим, что я не могу вызвать currval в одном сеансе, потому что я не контролирую границы транзакций. Я мог бы работать в том же сеансе со своим следующим вызовом, но я тоже не могу.

Ответы [ 3 ]

1 голос
/ 14 июля 2009

В том же сеансе:

SELECT currval('seq');

РЕДАКТИРОВАТЬ: Но если вы не можете использовать currval / nextval, потому что вы не знаете, произойдет ли вставка и выбор значения последовательности в том же сеансе, и если вы используете postgresql 8.2 или более позднюю версию, вы можете вероятно, напишите ваше заявление вставки, как это.

INSERT INTO tbl (data) VALUES ('something') RETURNING id;

, который также должен возвращать последний вставленный идентификатор.

1 голос
/ 14 июля 2009

Вы ищете INSERT ... RETURNING. С Раздел Руководства по INSERT:

Необязательное предложение RETURNING заставляет INSERT вычислять и возвращать значения, основанные на каждой вставленной строке. Это в первую очередь полезно для получения значений, которые были предоставлены по умолчанию, таких как серийный номер последовательности. Однако любое выражение, использующее столбцы таблицы, разрешено. Синтаксис списка RETURNING идентичен синтаксису списка вывода SELECT.

0 голосов
/ 14 июля 2009

Используйте nextval и currval, посмотрите здесь: http://www.postgresql.org/docs/8.0/static/functions-sequence.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...