#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