Sql error 42p01 error relation
Я новичок в создании баз данных, и эта ошибка меня ошеломила, так как я новичок в администрировании БД (в основном я выполняю запросы типа отчетов). Я создал новую базу данных через графический интерфейс pgAdmin3, и я пытаюсь создать объекты БД там, используя SQL, но получаю:
ERROR: relation “replays” does not exist
SQL state: 42P01
Я просмотрел руководство, но не нашел ничего очень полезного, хотя я подозреваю, что это может быть как-то связано с search_path. Вот скриншот. Есть идеи, что я делаю не так, пожалуйста?
Ответ
Я поговорил с кем-то, кто помог мне найти ответ. Правильный синтаксис, для любого в будущем. В документации упоминается об этом, хотя это может быть легко пропустить.
START TRANSACTION;
DROP SCHEMA IF EXISTS replays CASCADE;
CREATE SCHEMA replays;
CREATE ROLE admins WITH
PASSWORD ‘changeme’;
GRANT SELECT ON ALL TABLES IN SCHEMA replays TO PUBLIC;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA replays TO admins;
COMMIT;
PostgreSQL ERROR: 42P01: relation “[Table]” does not exist
У меня возникла эта странная проблема с использованием PostgreSQL 9.3 с таблицами, созданными с использованием qoutes. Например, если я создаю таблицу с использованием qoutes:
create table “TEST” (“Col1” bigint);
таблица создана правильно, и я вижу, что кавычки сохраняются при просмотре ее на панели SQL в pgAdminIII. Но когда я запрашиваю базу данных, чтобы найти список всех доступных таблиц (используя приведенный ниже запрос), я вижу, что результат не содержит кавычек вокруг имени таблицы.
select table_schema, table_name from information_schema.tables where not table_schema=’pg_catalog’ and not table_schema=’information_schema’;
Поскольку таблица была создана с кавычками, я не могу напрямую использовать имя таблицы, возвращенное из приведенного выше запроса, поскольку оно не заключено в кавычки и выдает ошибку в posted в заголовке.
Я мог бы попробовать заключить имена таблиц в кавычки во всех запросах, но я не уверен, что это будет работать постоянно. Я ищу способ получить список имен таблиц, которые заключены в кавычки в результате.
У меня такая же проблема с именами столбцов, но я надеюсь, что если я смогу найти решение проблемы с именами таблиц, аналогичное решение будет работать и для имен столбцов.
Ответ
у вас есть два варианта: – без кавычек: тогда все автоматически будет в нижнем регистре и без учета регистра – с кавычками: с этого момента все чувствительно к регистру.
я бы настоятельно рекомендовал НЕ использовать кавычки и заставить PostgreSQL вести себя без учета регистра. это делает жизнь намного проще. как только вы начнете цитировать, вы должны использовать его ВЕЗДЕ, поскольку PostgreSQL начнет быть очень точным.
некоторый пример:
TEST = test <– non case sensitive
“Test” <> Test <– first is precise, second one is turned to lower case
“Test” = “Test” <– will work
“test” = TEST <– should work; but you are just lucky.
действительно старайтесь избегать такого рода уловок любой ценой. для имен объектов используйте 7-битный ascii.
При использовании пакета npg в качестве хранилища данных ORM вы ожидаете, что платформа ORM (в нашем случае Entity Framework) сгенерирует инструкцию sql, вы можете столкнуться с исключением PostgreSQL, отношение “Имя таблицы” не существует
Либо таблица не создана, либо в сгенерированном операторе SQL чего-то не хватает. Попробуйте выполнить отладку с помощью Visual Studio, вы увидите, что имя схемы не является ведущим именем таблицы
SELECT “ID”, “Name”, “CreatedBy”, “CreatedDate”
FROM “TestTable”;
в то время как PostgreSQL ожидает имя схемы. Разрешение находится в классе DbContext переопределите метод OnModelCreating и добавьте modelBuilder.HasDefaultSchema(“SchemaName”); и запустите базовый конструктор, который должен выглядеть следующим образом
protected override void OnModelCreating(ModelBuilder modelBuilder) {
modelBuilder.HasDefaultSchema(“PartyDataManager”);
base.OnModelCreating(modelBuilder);
}