Postgres: синтаксическая ошибка на уровне или около «as»

#java #sql #postgresql #syntax-error #jooq

#java #sql #postgresql #синтаксическая ошибка #jooq

Вопрос:

Я использую JOOQ для подключения java к postgresql db. Он пытается выполнить этот запрос.

 insert into "public"."mission_batches" as "MB" 
  ("micro_task_id", "is_active", "created_at", "updated_at") 
values 
  ('7e1cc9e8-fc11-409b-865e-3bf08e6ca924', false, timestamp '2016-10-05 21:47:13.061', timestamp '2016-10-05 21:47:13.061') returning "MB"."id", "MB"."micro_task_id", "MB"."is_active", "MB"."created_at", "MB"."updated_at"
  

Но я получаю сообщение об ошибке из базы данных

 org.jooq.exception.DataAccessException: SQL [insert into "public"."mission_batches" as "MB" ("micro_task_id", "is_active", "created_at", "updated_at") values (?, ?, cast(? as timestamp), cast(? as timestamp)) returning "MB"."id", "MB"."micro_task_id", "MB"."is_active", "MB"."created_at", "MB"."updated_at"];
ERROR: syntax error at or near "as"
  Position: 40
  

Он работает с моей локальной базой данных [9.5]. На тестовом сервере [9.4] он выдает эту ошибку. Где я должен искать исправление? Сторона Java или сторона PG?

Ответ №1:

Псевдоним таблицы, в которую вы вставляете, был добавлен только в Postgres 9.5 (сравните документацию Postgres 9.5 с документацией 9.4. Поскольку столбцы в returning предложении в любом случае ссылаются на вставленную таблицу, вы могли бы так же легко обойтись без нее:

 insert into "public"."mission_batches"
  ("micro_task_id", "is_active", "created_at", "updated_at") 
values 
  ('7e1cc9e8-fc11-409b-865e-3bf08e6ca924', false,
   timestamp '2016-10-05 21:47:13.061', timestamp '2016-10-05 21:47:13.061') 
returning 
  "id", "micro_task_id", "is_active", "created_at", "updated_at"
  

Комментарии:

1. Итак, только псевдоним для вставки не поддерживается в 9.4? Потому что этот запрос выполняется отлично select "U"."id", "U"."username", "E"."email" from "public"."users" as "U" join "public"."emails" as "E" on "U"."id" = "E"."user_id" where "E"."email" = 'abc@xyz.com'

2. @theGamblerRises Да, сглаживание в select существует уже давно…

3. О, хорошо. Затем я изменю свой код и сделаю так, чтобы на всех устройствах была одинаковая версия. Спасибо