检查表是否存在

时间:2010-05-31 10:03:18

标签: java jdbc

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

给定一个名为conn for我的数据库的Connection对象,我该怎么检查呢?

6 个答案:

答案 0 :(得分:117)

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
}

答案 1 :(得分:64)

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

  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")); 
  }

有关详细信息,请参阅here。另请注意the JavaDoc中的警告。

答案 2 :(得分:8)

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

至少有两件事你需要确定:

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

  2. 确保使用等号检查结果集中的表名 比赛。原因是getTables()进行模式匹配 表的查询和_字符是SQL中的通配符。 假设您正在检查是否存在名为的表 EMPLOYEE_SALARY。然后,您将在EMPLOYEESSALARY上获得匹配 这不是你想要的。

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

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

    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;
    }
    

    您可能希望在types来电时考虑作为getTables()参数(第4个参数)传递的内容。通常我会在null离开,因为你不想限制自己。 VIEW和TABLE一样好,对吧?目前,许多数据库允许您通过VIEW进行更新,因此在大多数情况下只限制TABLE类型是不可行的。 YMMV。

答案 3 :(得分:6)

添加到Gaby的帖子,我的Oracle 10g的jdbc getTables()要求所有上限工作:

"employee" -> "EMPLOYEE"

否则我会得到一个例外:

  

java.sql.SqlExcepcion耗尽的结果集

(即使“员工”在架构中)

答案 4 :(得分:1)

    /**
 * Method that checks if all tables exist
 * If a table doesnt exist it creates the table
 */
public void checkTables() {
    try {
        startConn();// method that connects with mysql database
        String useDatabase = "USE " + getDatabase() + ";";
        stmt.executeUpdate(useDatabase);
        String[] tables = {"Patients", "Procedures", "Payments", "Procedurables"};//thats table names that I need to create if not exists
        DatabaseMetaData metadata = conn.getMetaData();

        for(int i=0; i< tables.length; i++) {
            ResultSet rs = metadata.getTables(null, null, tables[i], null);
            if(!rs.next()) {
                createTable(tables[i]);
                System.out.println("Table " + tables[i] + " created");
            }
        }
    } catch(SQLException e) {
        System.out.println("checkTables() " + e.getMessage());
    }
    closeConn();// Close connection with mysql database
}

答案 5 :(得分:0)

如果使用jruby,这里是一个代码片段,用于返回db中所有表的数组。

require "rubygems"
require "jdbc/mysql"
Jdbc::MySQL.load_driver
require "java"

def get_database_tables(connection, db_name)
  md = connection.get_meta_data
  rs = md.get_tables(db_name, nil, '%',["TABLE"])

  tables = []
  count = 0
  while rs.next
    tables << rs.get_string(3)
  end #while
  return tables
end