检查表是否存在

Dmi*_*try 81 java jdbc

我有一个嵌入了数据库的桌面应用程序.当我执行我的程序时,我需要检查特定的表是否存在,或者如果不存在则创建它.

给定一个名为conn的Connection对象作为我的数据库,我该如何检查?

Rea*_*wTo 119

DatabaseMetaData dbm = con.getMetaData();
// check if "employee" table is there
ResultSet tables = dbm.getTables(null, null, "employee", null);
if (tables.next()) {
  // Table exists
}
else {
  // Table does not exist
}
Run Code Online (Sandbox Code Playgroud)

  • 确保在使用表名时不使用下划线等模式字符,例如"employee_reports".我被这样的情况所困,因为一些元数据实现使用模式匹配.最好在if中使用简单的table.equals("employee_reports")语句仔细检查结果集 (3认同)

Bri*_*new 65

您可以使用可用的元数据:

  DatabaseMetaData meta = con.getMetaData();
  ResultSet res = meta.getTables(null, null, "My_Table_Name", 
     new String[] {"TABLE"});
  while (res.next()) {
     System.out.println(
        "   "+res.getString("TABLE_CAT") 
       + ", "+res.getString("TABLE_SCHEM")
       + ", "+res.getString("TABLE_NAME")
       + ", "+res.getString("TABLE_TYPE")
       + ", "+res.getString("REMARKS")); 
  }
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参见此处 另请注意JavaDoc中的警告.

  • 您正在从服务器请求所有表,然后在本地浏览这些名称.如果您只想检查表'X'是否存在,那么效率不高.你会想要使用`getTables()`方法的第三个参数!(而不是像你一样使用'null') (14认同)
  • 如果表名与架构一起提供,则此解决方案不起作用,因此请小心使用。要提供架构,您应该使用 `meta.getTables("Schema_Name", null, "My_Table_Name", new String[] {"TABLE"}) ` (2认同)

pet*_*erh 8

我实际上并没有发现任何提出的解决方案是完全完整的,所以我将添加自己的解决方案.这里没什么新鲜的.您可以从其他呈现的解决方案以及各种注释中将其拼接在一起.

至少有两件事你必须确保:

  1. 确保将表名传递给getTables()方法,而不是传递空值.在第一种情况下,让数据库服务器为您过滤结果,在第二种情况下,您从服务器请求所有表的列表,然后在本地过滤列表.如果您只搜索单个表,前者会快得多.

  2. 确保使用等于匹配的结果集检查表名.原因是getTables()对表和_字符的查询进行模式匹配是SQL中的通配符.假设您正在检查是否存在名为的表 EMPLOYEE_SALARY.然后你也会得到一个匹配,EMPLOYEESSALARY这不是你想要的.

哦,并且记得关闭那些结果集.从Java 7开始,您可能希望使用try-with-resources语句.

这是一个完整的解决方案:

public static boolean tableExist(Connection conn, String tableName) throws SQLException {
    boolean tExists = false;
    try (ResultSet rs = conn.getMetaData().getTables(null, null, tableName, null)) {
        while (rs.next()) { 
            String tName = rs.getString("TABLE_NAME");
            if (tName != null && tName.equals(tableName)) {
                tExists = true;
                break;
            }
        }
    }
    return tExists;
}
Run Code Online (Sandbox Code Playgroud)

您可能需要考虑typesgetTables()通话中传递的参数(第4个参数).通常我会离开,null因为你不想限制自己.VIEW和TABLE一样好,对吧?目前,许多数据库允许您通过VIEW进行更新,因此在大多数情况下,仅限于TABLE类型是不可行的.因人而异.


waw*_*iwa 6

添加到Gaby的帖子中,我的Oracle 10g的jdbc getTables()需要全部大写:

"employee" -> "EMPLOYEE"

否则我会得到一个例外:

java.sql.SqlExcepcion耗尽的结果集

(即使"员工"在架构中)