【问题标题】:Java SQL "ERROR: Relation "Table_Name" does not exist"Java SQL“错误:关系“表名”不存在”
【发布时间】:2011-04-23 18:35:46
【问题描述】:

我正在尝试将 netbeans 连接到我的 postgresql 数据库。连接似乎有效,因为我在连接时没有收到任何错误或异常,getCatalog() 等方法也返回正确答案。

但是当我尝试运行一个简单的 SQL 语句时,我收到错误“错误:关系“TABLE_NAME”不存在”,其中 TABLE_NAME 是我在数据库中确实存在的任何一个表。这是我的代码:

    Statement stmt = con.createStatement();

    ResultSet rs;

    String query = "SELECT * FROM clients";

    rs = stmt.executeQuery(query);

我在想 netbeans 可能找不到表,因为它没有在默认模式(公共)中查找,有没有办法在 java 中设置模式?

编辑:我的连接代码。数据库名称是Cinemax,当我省略语句代码时,我没有收到任何错误。

    String url = "jdbc:postgresql://localhost:5432/Cinemax";
    try{

    try {
        Class.forName("org.postgresql.Driver");
    } catch (ClassNotFoundException cnfe) {
        System.err.println("Couldn't find driver class:");
        cnfe.printStackTrace();
    }

    Connection con = DriverManager.getConnection( url,"postgres","desertrose147");

【问题讨论】:

  • 不能这样重写sql吗? SELECT * FROM <schem_name>.clients
  • 您没有显示如何连接到数据库服务器。我怀疑@CoolBeans 在上面是正确的或非常接近。您的表与您在连接时指定的模式不同(以上将修复)或在另一个数据库中。
  • 我喜欢...你能告诉我们你真正的错误吗?当您执行“select * from clients”时,我认为数据库不会说“relation TABLE_NAME ...”。
  • 我试过了,但我得到了同样的错误,“错误:关系“public.clients”不存在”(我的任何其他表都一样)。 public 是我唯一的架构,所以它也是默认架构。感谢您迄今为止的帮助。
  • 在 postgresql.conf 中将 log_min_duration_statement 设置为 0,重新启动数据库,运行应用程序并在 postgresql 日志中检查发送到数据库的真正查询是什么。还有一件事......你100%确定你有桌子吗?你可以使用 psql/pgadmin 连接到这个数据库并在那里执行查询吗?

标签: java sql postgresql quoted-identifier


【解决方案1】:

我怀疑您使用双引号创建了表格,例如"Clients" 或其他大小写字符组合,因此表名现在区分大小写。

声明是什么

 SELECT table_schema, table_name
 FROM information_schema.tables 
 WHERE lower(table_name) = 'clients'

返回?

如果返回的表名不是小写的,在引用它时必须使用双引号,如下所示:

String query = "SELECT * FROM \"Clients\"";

【讨论】:

  • 我正在尝试使用 sequelize ORM,并且在其创建查询中,它在 table_name 上使用引号。感谢您的回答。
【解决方案2】:

您可以检查这些可能性:

String query = "SELECT * FROM clients";
String query = "SELECT * FROM CLIENTS";
String query = "SELECT * FROM \"clients\"";
String query = "SELECT * FROM \"CLIENTS\"";
String query = "SELECT * FROM Clients";

也许其中一种会起作用。

【讨论】:

  • 第一个、第二个和最后一个语句引用完全相同的表名。
【解决方案3】:

除了 CoolBeans 的建议之外,您还可能以对相关数据库或架构没有权限的其他用户身份连接到数据库。可以显示连接字符串吗?

【讨论】:

  • 我是唯一的数据库用户(postgres/root 用户),因为这只是我用来学习 postgresql 的一个小型数据库。我在原始问题的编辑中包含了连接字符串。感谢您迄今为止的帮助。
【解决方案4】:

有趣的是,我遇到了与刚开始使用 netbeans 和 postgressql db 相同的事情,并且在注意到问题是我在 postgressql 中的表在我和我的命名约定中具有大写字母后,该错误得到了修复用于 INSERT 的 jdbc 查询语句未能找到该表。但是在重命名我在数据库中的表并修复列名之后,我很高兴。希望对您有所帮助。

【讨论】:

  • 应该修改它的响应以适应更好的语法
猜你喜欢
  • 2019-06-10
  • 1970-01-01
  • 1970-01-01
  • 2014-12-25
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
相关资源
最近更新 更多