ОШИБКА: синтаксическая ошибка в или рядом с «.» СТРОКА 4: ВКЛ.нравится.takerId = кадр.likeId;

#sql #postgresql #quoted-identifier

Вопрос:

у меня есть столик, который называется like . Но всякий раз, когда мне нужно выбирать данные из like, я получал эту ошибку, я понял это public.like ..но когда я пытаюсь объединить две таблицы

 SELECT *
FROM frame
INNER JOIN public.like
ON like.takerId = frame.likeId;
 

я получаю эту ошибку

 ERROR:  syntax error at or near "."
LINE 4: ON like.takerId = frame.likeId;
 

я также использую публичный префикс, но он выбрасывает

 ERROR:  column like.takerid does not exist
LINE 4: ON public.like.takerId = frame.likeId;
           ^
HINT:  Perhaps you meant to reference the column "like.takerId".

 

даже если это говорит column like.takerid does not exist , то почему это дает мне HINT: Perhaps you meant to reference the column "like.takerId". , я не знаю, я думаю, что это проблема с like именем таблицы, like это синтаксис sql, и он предполагает like и синтаксис sql и выдает мне ошибку. Должен ли я изменить имя своей таблицы? Или есть ли какой-либо способ сделать регистр sql чувствительным или как я могу сказать sql игнорировать like . public.like не работает для соединительной таблицы.

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

1. Вы используете зарезервированные слова в качестве имен

2. Я бы рекомендовал likes . Множественное число с гораздо меньшей вероятностью будет мешать зарезервированным словам и ключевым словам. Кроме того, таблицы содержат несколько сущностей, поэтому уместно использовать множественное число.

Ответ №1:

Как like и зарезервированное ключевое слово, вам необходимо использовать двойные кавычки для каждого его появления (если только оно не имеет префикса имени схемы, как вы выяснили).

 SELECT *
FROM frame
  JOIN public.like ON "like".takerId = frame.likeId;
 

Или

 SELECT *
FROM frame
  JOIN "like" ON "like".takerId = frame.likeId;
 

Или используйте псевдоним

 SELECT *
FROM frame f
  JOIN "like" l ON l.takerId = f.likeId;
 

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

Ответ №2:

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

 CREATE TABLE public."like" (id int);
INSERT INTO public."like" VALUES (42);
SELECT * FROM "public.like"
 

ИЗМЕНИТЬ: Как указал @a_horse_with_no_name, указание схемы во временных таблицах не будет работать (проверка db<>fiddle ), поэтому только имя таблицы должно быть между двойными кавычками, как исправлено в приведенном выше фрагменте. Для временных таблиц просто опустите схему:

 CREATE TEMPORARY TABLE "like" (id int);
INSERT INTO "like" VALUES (42);
SELECT * FROM "like"
 

ДЕМОНСТРАЦИЯ: db<>fiddle

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

1. @a_horse_with_no_name Я сначала так и подумал, но это выдало ошибку: dbfiddle.uk/…

2. @a_horse_with_no_name ах, теперь я вижу проблему… он не работает с `ВРЕМЕННЫМИ таблицами 😛 dbfiddle.uk/…

3. вы не можете указать схему для временных таблиц.

4. @a_horse_with_no_name спасибо, что указали! Удивительно, как простые вещи могут стать сложными.. Я просто исправил это. 1