21

我在使用 PostgreSQL 9.3 和使用 qoutes 创建的表时遇到了这个奇怪的问题。例如,如果我使用 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

4 回答 4

40

你有两个选择: - 不带引号:那么所有内容都将自动小写且不区分大小写 - 带引号:从现在开始,所有内容都区分大小写。

我强烈建议不要使用引号并使 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。

于 2014-10-29T13:18:52.410 回答
4

在使用 npg 包作为数据存储 ORM 时,您期望 ORM 框架(在我们的例子中为实体框架)生成 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);         
}
于 2019-02-16T18:36:42.847 回答
3

就我而言。数据库中的表必须是小写...更改名称 dataTable do datatable help

于 2021-02-23T09:29:22.237 回答
2

用于在 SQL 语句字符串中适当地引用标识符的字符串函数是quote_ident(),它引用了一个很好的示例(与相关的一起使用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"
 ...
于 2014-10-30T22:14:09.897 回答