Ошибка столбец не существует postgresql

I got the same error when I do PIVOT in RedShift.
My code is similar to

SELECT *
INTO output_table
FROM (
SELECT name, year_month, sales
FROM input_table
) 
PIVOT
(
SUM(sales)
FOR year_month IN ('nov_2020', 'dec_2020', 'jan_2021', 'feb_2021', 'mar_2021', 'apr_2021', 'may_2021', 'jun_2021', 'jul_2021', 'aug_2021',
                  'sep_2021', 'oct_2021', 'nov_2021', 'dec_2021', 'jan_2022', 'feb_2022', 'mar_2022', 'apr_2022', 'may_2022', 'jun_2022',
                  'jul_2022', 'aug_2022', 'sep_2022', 'oct_2022', 'nov_2022')
)

I tried year_month without any quote (got the error), year_month with double quote (got the error), and finally year_month with single quote (it works this time). This may help if someone in the same situation like my example.

As others suggested in comments, this is probably a matter of upper-case versus lower-case, or some whitespace in the column name. (I’m using an answer so I can format some code samples.) To see what the column names really are, try running this query:

SELECT '"' || attname || '"', char_length(attname)
  FROM pg_attribute
  WHERE attrelid = 'table_name'::regclass AND attnum > 0
  ORDER BY attnum;

You should probably also check your PostgreSQL server log if you can, to see what it reports for the statement.

If you quote an identifier, everything in quotes is part of the identifier, including upper-case characters, line endings, spaces, and special characters. The only exception is that two adjacent quote characters are taken as an escape sequence for one quote character. When an identifier is not in quotes, all letters are folded to lower-case. Here’s an example of normal behavior:

test=# create table t (alpha text, Bravo text, "Charlie" text, "delta " text);
CREATE TABLE
test=# select * from t where Alpha is null;
 alpha | bravo | Charlie | delta  
-------+-------+---------+--------
(0 rows)

test=# select * from t where bravo is null;
 alpha | bravo | Charlie | delta  
-------+-------+---------+--------
(0 rows)

test=# select * from t where Charlie is null;
ERROR:  column "charlie" does not exist
LINE 1: select * from t where Charlie is null;
                              ^
test=# select * from t where delta is null;
ERROR:  column "delta" does not exist
LINE 1: select * from t where delta is null;
                              ^

The query I showed at the top yields this:

 ?column?  | char_length 
-----------+-------------
 "alpha"   |           5
 "bravo"   |           5
 "Charlie" |           7
 "delta "  |           6
(4 rows)

I got the same error when I do PIVOT in RedShift.
My code is similar to

SELECT *
INTO output_table
FROM (
SELECT name, year_month, sales
FROM input_table
) 
PIVOT
(
SUM(sales)
FOR year_month IN ('nov_2020', 'dec_2020', 'jan_2021', 'feb_2021', 'mar_2021', 'apr_2021', 'may_2021', 'jun_2021', 'jul_2021', 'aug_2021',
                  'sep_2021', 'oct_2021', 'nov_2021', 'dec_2021', 'jan_2022', 'feb_2022', 'mar_2022', 'apr_2022', 'may_2022', 'jun_2022',
                  'jul_2022', 'aug_2022', 'sep_2022', 'oct_2022', 'nov_2022')
)

I tried year_month without any quote (got the error), year_month with double quote (got the error), and finally year_month with single quote (it works this time). This may help if someone in the same situation like my example.

Создаю отношение

create table ПОТРЕБИТЕЛЬ (
    ИДЕНТИФИКАТОР serial not null primary key,
    НАЗВАНИЕ varchar(50) not null,
    "АДРЕС ЖИТЕЛЬСТВА" varchar(255) not null,
    "СКИДКА, %" smallint check ("СКИДКА, %" >= 0 and "СКИДКА, %" <= 100) not null
);

Затем пытаюсь заполнить таблицу, используя значения

insert into ПОТРЕБИТЕЛЬ (ИДЕНТИФИКАТОР, НАЗВАНИЕ, "АДРЕС ЖИТЕЛЬСТВА", "СКИДКА, %") values (001, "АО ВАРЯ", "Сормовский", 10);
insert into ПОТРЕБИТЕЛЬ (ИДЕНТИФИКАТОР, НАЗВАНИЕ, "АДРЕС ЖИТЕЛЬСТВА", "СКИДКА, %") values (002, "ГАЗ", "Автозаводский", 7);
insert into ПОТРЕБИТЕЛЬ (ИДЕНТИФИКАТОР, НАЗВАНИЕ, "АДРЕС ЖИТЕЛЬСТВА", "СКИДКА, %") values (003, "МП ВЕРА", "Канавинский", 5);
insert into ПОТРЕБИТЕЛЬ (ИДЕНТИФИКАТОР, НАЗВАНИЕ, "АДРЕС ЖИТЕЛЬСТВА", "СКИДКА, %") values (004, "МП", "Канавинский", 3);
insert into ПОТРЕБИТЕЛЬ (ИДЕНТИФИКАТОР, НАЗВАНИЕ, "АДРЕС ЖИТЕЛЬСТВА", "СКИДКА, %") values (005, "АО СТАЛЬ", "Советский", 0);

Возникает ошибка в каждой строчке, якобы столбец не существует, при этом это даже не столбцы а аргументы
введите сюда описание изображения

    Меня все больше удивляют авторы СУБД PostgreSQL. На моих тестовых серверах и у клиентов установлена ее 11-я версия. Обычно я стараюсь себе на компьютер устанавливать последние версии программного обеспечения. Так же было и с PostgreSQL — когда возникла необходимость ее установить локально, я установил 12-ю версию. Залил дамп базы, запустил свою утилиту и получил ошибку «column pd.adsrc does not exist». Я сразу подумал, что при импорте дампа возникла ошибка и загрузил его снова. Но ошибка повторилась. Установил PostgreSQL на другой компьютер и получил «столбец pd.adsrc не существует».
    Гугл быстро дал ответ на мою проблему. Оказалось, что в PostgreSQL 12-й версии из системной таблицы pg_catalog.pg_attrdef разработчики удалили поле «adsrc». Они просто решили, что это поле устаревшее и оно им не нужно… Вот разве так можно? Гора программного обеспечения, которую годами разрабатывали программисты по всему миру, перестанет корректно работать на новой версии СУБД. Может мне везло, но с подобной проблемой я не сталкивался ни у Oracle, ни у MS SQLServer. Например, недавно я узнал, что несколько почтовых сервисов, который я писал примерно 16-18 лет тому назад, успешно работают с базой данных на MS SQLServer 2019. Таким образом в моих глазах СУБД PostgreSQL получает очередной минус.
    Все предлагаемые мне гуглом варианты решения этой проблемы были для pgAdmin. А что делать тем, у кого запросы не в скрипте, а в бинарнике? Первая моя мысль была добавить поле adsrc в таблицу pg_catalog.pg_attrdef. Но все же я решил, что это не выход. Правильно решать ее в своей программе. В используемой мной библиотеке для доступа к базам данных «PostgreSQL 12 is supported» только с версии 8.1. То есть для меня путь к 12-й версии PostgreSQL один — «достать кошелек» и обновить UniDac. Эта ситуация с PostgreSQL еще раз подтвердила, что использование open source продуктов, даже если не на прямую, а косвенно, но все равно приводит к лишним затратам.


0

1

При попытке выполнить обновление или удаление строки выдается сообщение об отсутствии поля таблицы. Хотя оно есть. Что я делаю не так?

mgi@mgi-Linux:~$ sudo su postgres
[sudo] пароль для mgi:
postgres@mgi-Linux:/home/mgi$ psql
psql (11.4 (Ubuntu 11.4-1.pgdg18.04+1), сервер 10.9 (Ubuntu 10.9-1.pgdg18.04+1))
Введите «help», чтобы получить справку.

postgres=# c megriv
psql (11.4 (Ubuntu 11.4-1.pgdg18.04+1), сервер 10.9 (Ubuntu 10.9-1.pgdg18.04+1))
Вы подключены к базе данных «megriv» как пользователь «postgres».
megriv=# SELECT * FROM formanpa;
codForma | textForma
———-+——————
11 | Aaaaaaaaaaaaa
22 | Bbbbbbbb
33 | Cccccccccccccccc
(3 строки)

megriv=# UPDATE formanpa SET textForma = ‘B2b2b2b2b2′ WHERE codForma = ’22’;
ОШИБКА: столбец «codforma» не существует
СТРОКА 1: …PDATE formanpa SET textForma = ‘B2b2b2b2b2’ WHERE codForma =…
^
ПОДСКАЗКА: Возможно, предполагалась ссылка на столбец «formanpa.codForma».
megriv=# UPDATE formanpa SET textForma = ‘B2b2b2b2b2′ WHERE formanpa.codForma = ’22’;
ОШИБКА: столбец formanpa.codforma не существует

yoimelv

0 / 0 / 0

Регистрация: 16.01.2019

Сообщений: 12

1

08.10.2022, 21:58. Показов 1015. Ответов 4

Метки postgres sql, sql posrgre (Все метки)


Здравствуйте! Не получается объединить таблицы по внешнему ключу. PGadmin пишет:
«ERROR: ОШИБКА: столбец users.fk не существует
LINE 1: SELECT * FROM users INNER JOIN hobby ON users.fk = hobby.pk
^

SQL state: 42703
Character: 41″
Не понимаю в чём проблема. Внешний ключ существует и с ним всё в порядке.

Таблица hobby:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE IF NOT EXISTS public.hobby
(
    id INTEGER NOT NULL DEFAULT NEXTVAL('hobby_id_seq'::regclass),
    hobby_name CHARACTER VARYING COLLATE pg_catalog."default" NOT NULL,
    CONSTRAINT hobby_pkey PRIMARY KEY (hobby_name)
        INCLUDE(id)
)
 
TABLESPACE pg_default;
 
ALTER TABLE IF EXISTS public.hobby
    OWNER TO postgres;

Таблица users:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE TABLE IF NOT EXISTS public.users
(
    id INTEGER NOT NULL DEFAULT NEXTVAL('users_id_seq'::regclass),
    first_name CHARACTER VARYING COLLATE pg_catalog."default" NOT NULL,
    second_name CHARACTER VARYING COLLATE pg_catalog."default" NOT NULL,
    date_of_birth DATE NOT NULL,
    email CHARACTER VARYING COLLATE pg_catalog."default" NOT NULL,
    hobby CHARACTER VARYING COLLATE pg_catalog."default",
    CONSTRAINT users_pkey PRIMARY KEY (id),
    CONSTRAINT hobby_fkey FOREIGN KEY (hobby)
        REFERENCES public.hobby (hobby_name) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
        NOT VALID
)
 
TABLESPACE pg_default;
 
ALTER TABLE IF EXISTS public.users
    OWNER TO postgres;

Запрос, который не получается произвести:

SQL
1
SELECT * FROM users INNER JOIN hobby ON users.fk = hobby.pk

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

0

4720 / 3928 / 994

Регистрация: 29.08.2013

Сообщений: 25,187

Записей в блоге: 3

08.10.2022, 22:57

2

а ткните пальцем где именно в таблице users колонка fk

да и pk я не вижу

0

yoimelv

0 / 0 / 0

Регистрация: 16.01.2019

Сообщений: 12

08.10.2022, 23:22

 [ТС]

3

Честно говоря, не знаю. Делали задание в классе, там всё получилось, а вот дома — нет, ошибка где-то. Нужно было выполнить запрос:

SQL
1
SELECT * FROM table1 INNER JOIN table2 ON table1.fk = table2.pk

В классе программа сама предложила дописать запрос в конце, поэтому как раз часть

SQL
1
table1.fk = table2.pk

так и не понял, просто не запомнил, что там написал.

0

Аватар

1419 / 887 / 339

Регистрация: 31.05.2012

Сообщений: 3,114

09.10.2022, 09:13

4

SQL
1
ON users.hobby = hobby.hobby_name

0

4720 / 3928 / 994

Регистрация: 29.08.2013

Сообщений: 25,187

Записей в блоге: 3

09.10.2022, 17:40

5

Цитата
Сообщение от yoimelv
Посмотреть сообщение

Делали задание в классе, там всё получилось

так голову нужно включать
таблицы то соединяются по колонкам, а у вас явное сообщение «столбец users.fk не существует»

0

IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

09.10.2022, 17:40

Помогаю со студенческими работами здесь

DataGridView. Существует ли столбец?
Как мне узнать, существует ли столбец с заданным именем в DataGridView?
Проверять в цикле не…

Ошибка — Не существует в пространстве имен, но оно существует!
Всем привет! В соседней ветке пытаюсь разобраться как адекватно сделать вертикальную менюшку, но…

База данных — столбец в таблице не существует
pgAdmin 4 выдает ошибку: ERROR: ОШИБКА: столбец &quot;Дискретная математика&quot; в таблице &quot;Экзамены&quot; не…

Как проверить существует ли столбец в DGV
у меня в компоненте грид столбцы создаются динамически, так вот как создать условие которое…

Существует ли в матрице столбец, состоящий только из нулей
Заполнить массив 2 на 5 случайными числами от 0 до 1. вывести «да», если существует столбец,…

Существует ли в матрице строка или столбец палиндром
помогите пожалуйста создать программу для задачи :
существует ли в матрице строка или столбец…

Функция определяющая, существует ли столбец матрицы, упорядоченный по возрастанию
помогите написать ТОЛЬКО ФУНКЦИЮ.
А именно, описать функцию проверки, существует ли в квадратной…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

5

@fatim

Simple LINQ query produces the following sql:
SELECT «Extent1″.»price» FROM «schema1».»table1″ AS «Extent1»
which fails with «ERROR: 42703: column Extent1.price does not exist»

Another example from modified LINQ query
SELECT «Alias1″.»Id», «Alias1″.»price» FROM «schema1».»table1″ AS «Alias1» LIMIT 1
ERROR: 42703: column Alias1.Id does not exist

Manually running those statements without the quotes works fine.
My setup is Npgsql.EntityFramework 2.2.5.0 / EF 6.1.3.0 / Postgres 9.4.1

@franciscojunior

When used with quotes, Postgresql is case sensitive regarding identifier names like table names and columns names.
In your case, your column name may have been created with double quotes using a different case of price. Maybe it was created as "Price"? If so, just recreate it without quotes, or using the same case sensitivity of your queries.

I need to check it, but I think those quotes are added by EF when generating the queries.

I hope it helps.

@fatim

Thanks Francisco, you are right, this issue is caused by case mismatch.
Is there way to switch Npgsql to case-insensitive mode apart from applying data annotations to the model columns ?

@franciscojunior

Hi, @fatim !
I’m glad you got it working.

Is there way to switch Npgsql to case-insensitive mode apart from applying data annotations to the model columns ?

I don’t know it yet. I need to check if we can make something about those quotes.
@Emill , do you have any idea if it is possible to remove those quotes from EF queries?
Thanks in advance.

@Emill

Postgresql’s names are case-sensitive but for some strange reason the identifiers put in an sql query are automatically converted to lower case by the lexer unless they are surrounded by quotes.

If the properties of the models don’t match the column names, it is possible by using attributes to use other column names.

If requested, we could have some option to automatically convert CamelCase identifiers to lower_case_with_underlines to better fit the naming conventions used by .net and Postgresql.

@roji

You can use EF6’s own API to specify the database names on all classes and properties (some Linq on the model + EF6’s fluent API should do the trick).

As others suggested in comments, this is probably a matter of upper-case versus lower-case, or some whitespace in the column name. (I’m using an answer so I can format some code samples.) To see what the column names really are, try running this query:

SELECT '"' || attname || '"', char_length(attname)
  FROM pg_attribute
  WHERE attrelid = 'table_name'::regclass AND attnum > 0
  ORDER BY attnum;

You should probably also check your PostgreSQL server log if you can, to see what it reports for the statement.

If you quote an identifier, everything in quotes is part of the identifier, including upper-case characters, line endings, spaces, and special characters. The only exception is that two adjacent quote characters are taken as an escape sequence for one quote character. When an identifier is not in quotes, all letters are folded to lower-case. Here’s an example of normal behavior:

test=# create table t (alpha text, Bravo text, "Charlie" text, "delta " text);
CREATE TABLE
test=# select * from t where Alpha is null;
 alpha | bravo | Charlie | delta  
-------+-------+---------+--------
(0 rows)

test=# select * from t where bravo is null;
 alpha | bravo | Charlie | delta  
-------+-------+---------+--------
(0 rows)

test=# select * from t where Charlie is null;
ERROR:  column "charlie" does not exist
LINE 1: select * from t where Charlie is null;
                              ^
test=# select * from t where delta is null;
ERROR:  column "delta" does not exist
LINE 1: select * from t where delta is null;
                              ^

The query I showed at the top yields this:

 ?column?  | char_length 
-----------+-------------
 "alpha"   |           5
 "bravo"   |           5
 "Charlie" |           7
 "delta "  |           6
(4 rows)

As others suggested in comments, this is probably a matter of upper-case versus lower-case, or some whitespace in the column name. (I’m using an answer so I can format some code samples.) To see what the column names really are, try running this query:

SELECT '"' || attname || '"', char_length(attname)
  FROM pg_attribute
  WHERE attrelid = 'table_name'::regclass AND attnum > 0
  ORDER BY attnum;

You should probably also check your PostgreSQL server log if you can, to see what it reports for the statement.

If you quote an identifier, everything in quotes is part of the identifier, including upper-case characters, line endings, spaces, and special characters. The only exception is that two adjacent quote characters are taken as an escape sequence for one quote character. When an identifier is not in quotes, all letters are folded to lower-case. Here’s an example of normal behavior:

test=# create table t (alpha text, Bravo text, "Charlie" text, "delta " text);
CREATE TABLE
test=# select * from t where Alpha is null;
 alpha | bravo | Charlie | delta  
-------+-------+---------+--------
(0 rows)

test=# select * from t where bravo is null;
 alpha | bravo | Charlie | delta  
-------+-------+---------+--------
(0 rows)

test=# select * from t where Charlie is null;
ERROR:  column "charlie" does not exist
LINE 1: select * from t where Charlie is null;
                              ^
test=# select * from t where delta is null;
ERROR:  column "delta" does not exist
LINE 1: select * from t where delta is null;
                              ^

The query I showed at the top yields this:

 ?column?  | char_length 
-----------+-------------
 "alpha"   |           5
 "bravo"   |           5
 "Charlie" |           7
 "delta "  |           6
(4 rows)

Для добавления нового столбца в существующую таблицу в базе данных PostgreSQL нужно воспользоваться оператором изменения таблицы, который называется ALTER TABLE.

Исходная таблица с данными выглядит так:

CREATE TABLE test.t15102022 (
  id bigint NOT NULL DEFAULT 0,
  name text NOT NULL
)

INSERT INTO test.t15102022 VALUES (1, 'Вася'), (2, 'Петя');

SELECT * FROM test.t15102022;

Скриншот из веб-интерфейса pgAdmin4:

Создали таблицу на два столбца и положили в неё данные - PostgreSQL

Создали таблицу на два столбца и положили в неё данные — PostgreSQL

Добавление нового столбца в существующую таблицу в PostgreSQL при помощи команды ALTER TABLE и предложением ADD COLUMN

Пишем SQL-запрос, который добавит столбец «возраста» — age:

ALTER TABLE test.t15102022 ADD COLUMN age bigint;

Скриншот:

Добавили новый столбец age в существующую таблицу в PostgreSQL

Добавили новый столбец age в существующую таблицу в PostgreSQL

Мы успешно добавили новый столбец в готовую таблицу и присвоили тип данных для него.

Добавление нового столбца в таблицу в PostgreSQL с проверками существования, и таблицы, и столбца в ней

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

ALTER TABLE test.t15022022 ADD COLUMN age bigint;

Если мы попытаемся добавить столбец в несуществующую таблицу, тогда будет такая ошибка:

Ошибка при добавлении столбца в таблицу - таблица не существует - PostgreSQL

Ошибка при добавлении столбца в таблицу — таблица не существует — PostgreSQL

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

Чтобы избежать ошибки нужно добавить предложение IF EXISTS после команды ALTER TABLE.

ALTER TABLE IF EXISTS test.t15022022 ADD COLUMN age bigint;

В этом случае мы получим просто замечание, вместо ошибки.

Замечание при добавлении столбца в таблицу - таблица не существует - PostgreSQL

Замечание при добавлении столбца в таблицу — таблица не существует — PostgreSQL

Разница между ошибкой и замечанием заключается в том, что при замечании выполнение алгоритма в теле функции продолжится в любом случае. И возможно это приведёт к корректному её завершению.

Если мы не используем предложение IF EXISTS, то тогда мы должны перехватывать потенциальные ошибки в теле функции и как-то их обрабатывать.

Также важно проверять существование столбца перед вставкой в таблицу. Причины те же — ошибки.

ALTER TABLE IF EXISTS test.t15102022 ADD COLUMN age bigint;

Ошибка — столбец уже существует.

Ошибка при добавлении столбца в таблицу - столбец уже существует - PostgreSQL

Ошибка при добавлении столбца в таблицу — столбец уже существует — PostgreSQL

Вместо ошибки лучше получить замечание. Для этого нужно добавить предложение IF NOT EXISTS после ADD COLUMN.

ALTER TABLE IF EXISTS test.t15102022 ADD COLUMN IF NOT EXISTS age bigint;

Замечание — столбец уже существует.

Замечание при добавлении столбца в таблицу - столбец уже существует - PostgreSQL

Замечание при добавлении столбца в таблицу — столбец уже существует — PostgreSQL

Это самый безопасный способ добавления нового столбца в таблицу.

Информационные ссылки

Официальный сайт WEB-оболочки pgAdmin — https://www.pgadmin.org

Официальный сайт СУБД PostgreSQL — https://www.postgresql.org

Команда «ALTER TABLE» — https://postgrespro.ru/docs/postgresql/14/sql-altertable

  • Ошибка столбец prokind не существует
  • Ошибка столбец none не существует
  • Ошибка столбец c relhasoids не существует символ 245
  • Ошибка стоила очень дорого
  • Ошибка студенчество отмечали начало каникул является