Postgres не будет принимать псевдоним таблицы перед именем столбца - программирование
Подтвердить что ты не робот

Postgres не будет принимать псевдоним таблицы перед именем столбца

Я использую фреймворк (Jodd), который добавляет псевдоним таблицы к именам столбцов в SQL Select. Он выглядит как хорошо сформированный SQL, но Postgres зажимает его.

update GREETING Greeting 
     set Greeting.ID=5, 
         Greeting.NAME='World', 
         Greeting.PHRASE='Hello World!'  
where (Greeting.ID=5)

дает ошибку:

Error: ERROR: column "greeting" of relation "greeting" does not exist
SQLState:  42703

Есть ли способ заставить Postgres принять этот SQL? Другая альтернатива - взломать фреймворк, который я не хочу делать.

4b9b3361

Ответ 1

Проблема заключается в том, что вы включаете псевдоним таблицы в предложение SET в столбцах. См. Документацию UPDATE в документах Postgres:

column

Имя столбца в table. Имя столбца может быть квалифицировано с именем подполя или индексом массива, если необходимо. Не включайте имя таблицы в спецификацию целевого столбца - например, UPDATE tab SET tab.col = 1 недействительно.

Это действительно в Postgres:

update GREETING Greeting 
set 
    NAME='World', 
    PHRASE='Hello World!' 
where Greeting.ID=5 ;

Ответ 2

Попробуйте использовать последнюю версию Jodd, v3.3.7. где эта проблема исправлена.

Проблема была в библиотеке Jodd: методы обновления объектов генерировали инструкцию update с псевдонимами таблиц. Новая версия просто не ставит псевдонимы таблицы; который работает и для Postgres, и для других баз данных.

Ответ 3

Проверьте документацию UPDATE, особенно для части column: запрещено префикс столбцов с помощью псевдоним таблицы в предложении SET.

UPDATE GREETING Greeting
   SET ID=5, NAME='World', PHRASE='Hello World!'
 WHERE (Greeting.ID=5);