我有一个嵌入了数据库的桌面应用程序。当我执行我的程序时,我需要检查特定的表是否存在,或者如果不存在则创建它。
给定一个名为conn for我的数据库的Connection对象,我该怎么检查呢?
答案 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)
我实际上并没有发现任何提供的解决方案完全完整,所以我将添加自己的解决方案。这里没什么新鲜的。您可以从其他呈现的解决方案和各种评论中将其拼接在一起。
至少有两件事你需要确定:
确保将表名传递给getTables()
method,
而不是传递空值。在第一种情况下,你让
数据库服务器在您请求的第二个过滤结果
来自服务器的所有表的列表,然后过滤列表
本地。如果你只是搜索一个,前者要快得多
单桌。
确保使用等号检查结果集中的表名
比赛。原因是getTables()
进行模式匹配
表的查询和_
字符是SQL中的通配符。
假设您正在检查是否存在名为的表
EMPLOYEE_SALARY
。然后,您将在EMPLOYEESSALARY
上获得匹配
这不是你想要的。
哦,并且记得关闭那些结果集。从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