Используйте RETURNING без явного указания столбцов

У меня есть таблица с несколькими столбцами, и я хочу вернуть идентификатор из запроса INSERT, используя RETURNING. К сожалению, кажется, что в этом случае я должен указать ВСЕ столбцы

INSERT INTO "user" ( "id", ... ) VALUES ( DEFAULT, ... ) RETURNING "id"

вместо того, чтобы просто делать

INSERT INTO "user" VALUES ( DEFAULT, ... ) RETURNING "id"

что делает запрос чрезвычайно длинным и довольно нечитаемым. Могу ли я как-то вернуть идентификатор, не указывая каждый столбец?


person Erik Aigner    schedule 30.03.2013    source источник


Ответы (2)


Конечно, вы можете. Ваш второй запрос должен просто работать - при условии, что id на самом деле занимает первую позицию в таблице - в чем я сомневаюсь.

Подтвердить с помощью:

SELECT attnum
FROM   pg_attribute
WHERE  attrelid = '"user"'::regclass
AND    attname = 'id';

Однако это не означает, что вы должны это делать. За исключением специальных вызовов, есть всего несколько случаев, когда вам не следует не добавлять список столбцов к INSERT командам.

В любом случае вам не следует использовать зарезервированное слово например user в качестве имени таблицы. Это очень плохая идея. Классический случай заряженного ножного ружья.

person Erwin Brandstetter    schedule 30.03.2013

Я не могу воспроизвести проблему. Я использую PostgreSQL версии 9.1, создал простую таблицу users со столбцами id и name.

Затем я выполнил этот запрос:

INSERT INTO users VALUES(DEFAULT,'jszobody') RETURNING id

Я получил обратно id без указания столбцов в запросе INSERT. Кажется, только что сработало.

Какую ошибку вы получаете? Какая версия PostgreSQL? Пробовали ли вы воспроизвести такой очень простой тестовый пример, исключив любые другие проблемы с запросом, значениями по умолчанию и т. д.?

person jszobody    schedule 30.03.2013
comment
Это очень странно. Должно быть, что-то еще (может быть, невидимый символ в запросе или что-то в этом роде) вызвало ошибку. Это действительно работает без указания столбцов после того, как я переписал всю строку запроса. - person Erik Aigner; 30.03.2013