PostgreSQL错误:42P01:关系" [表格]"不存在

时间:2014-10-29 13:08:27

标签: sql database postgresql postgis

我在使用带有qoutes创建的表格时使用PostgreSQL 9.3会遇到这个奇怪的问题。例如,如果我使用qoutes创建一个表:

create table "TEST" ("Col1" bigint);

正确创建了表,我可以看到在pgAdminIII的SQL窗格中查看引号时会保留引号。但是当我查询数据库以找到所有可用表的列表时(使用下面的查询),我看到结果不包含表名周围的引号。

select table_schema, table_name from information_schema.tables where not table_schema='pg_catalog' and not table_schema='information_schema';

由于表是使用引号创建的,因此我不能直接使用上面查询返回的表名,因为它没有引用,并在标题中发布错误。

我可以尝试在所有查询中用引号括起表名,但我不确定它是否会一直有效。我正在寻找一种方法来获取在结果中引用引号的表名列表。

我对列名也有同样的问题,但我希望如果我能找到表名问题的解决方案,类似的解决方案也适用于列名。

4 个答案:

答案 0 :(得分:18)

你有两个选择:    - 没有引号:那么一切都将自动为小写且不区分大小写    - 引号:从现在开始,一切都是区分大小写的。

我强烈建议不要使用引号并使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作为对象名称。

答案 1 :(得分:0)

用于在SQL语句字符串中引用标识符的字符串函数是quote_ident(),它引用good example(与相关的quote_literal()一起使用)。

使用您的示例,并混合使用其他结果:

select
   quote_ident(table_schema) as table_schema,
   quote_ident(table_name) as table_name
...

 table_schema |    table_name
--------------+------------------
 ...
 public       | good_name
 public       | "table"
 public       | some_table
 public       | "something else"
 public       | "Tom's work"
 public       | "TEST"
 ...

答案 2 :(得分:0)

使用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);         
}

答案 3 :(得分:0)

就我而言。数据库中的表必须是小写...更改名称dataTable做数据表帮助