![](/img/trans.png)
[英]Why PSQL create table returns [42P01] ERROR: relation does not exist
[英]PostgreSQL ERROR: 42P01: relation “[Table]” does not exist
我在使用 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';
由于该表是用引号创建的,我不能直接使用从上述查询返回的表名,因为它没有被引用并在标题中发布错误。
我可以尝试在所有查询中用引号括起表名,但我不确定它是否会一直工作。 我正在寻找一种方法来获取在结果中用引号引用的表名列表。
我对列名也有同样的问题,但我希望如果我能找到表名问题的解决方案,类似的解决方案也适用于列名。
您有两个选择: - 不加引号:那么所有内容都将自动变为小写且不区分大小写 - 使用引号:从现在开始,所有内容都区分大小写。
我强烈建议不要使用引号并使 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 框架(在我们的示例中为实体框架)生成 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);
}
用于在 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"
...
就我而言。 数据库中的表必须是小写...更改名称dataTable做数据表帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.