一、判斷表是否存在 (標準 JDBC DatabaseMetaData)
public boolean hasTable(Connection conn, String tableName) throws SQLException {
try (ResultSet rs = conn.getMetaData().getTables(null, null, tableName, new String[]{"TABLE"})) {
return rs.next(); // 存在至少一行即為真
}
}
getTables(catalog, schemaPattern, tableNamePattern, types)
- 通用於所有 JDBC 相容資料庫 (SQL Server, MySQL, Oracle, PostgreSQL, HSQLDB...)
- 大小寫敏感度依資料庫而定,建議統一大寫比對
二、重命名表 (跨資料庫差異處理)
public boolean renameTable(Connection conn, String src, String dest) throws SQLException {
String dbType = conn.getMetaData().getDatabaseProductName(); // 如 "Microsoft SQL Server", "MySQL", "HSQL Database Engine"
String sql;
if ("Microsoft SQL Server".equals(dbType)) {
// SQL Server: sp_rename 'old', 'new'
sql = "EXEC sp_rename " + quote(src) + ", " + quote(dest);
}
else if ("MySQL".equals(dbType) || "HSQL Database Engine".equals(dbType)) {
// MySQL / HSQLDB: ALTER TABLE old RENAME TO new
sql = "ALTER TABLE " + quote(src) + " RENAME TO " + quote(dest);
}
else if ("Oracle".equals(dbType)) {
// Oracle: RENAME old TO new (隱式提交)
sql = "RENAME " + quote(src) + " TO " + quote(dest);
}
else if ("PostgreSQL".equals(dbType)) {
// PostgreSQL: ALTER TABLE old RENAME TO new
sql = "ALTER TABLE " + quote(src) + " RENAME TO " + quote(dest);
}
else {
throw new SQLException("Unsupported database: " + dbType);
}
try (Statement st = conn.createStatement()) {
return st.executeUpdate(sql) >= 0; // DDL 通常返回 0
}
}
// 簡易引用符號包裹 (實際建議用 Identifier.quote 或驗證合法性)
private String quote(String ident) {
return "\"" + ident.replace("\"", "\"\"") + "\"";
}
資料庫重命名語法對比表
| 資料庫 | 語法 | 備註 |
| SQL Server | EXEC sp_rename 'old', 'new' | 需單引號,可跨 Schema |
| MySQL | ALTER TABLE old RENAME TO new | 或 RENAME TABLE old TO new |
| PostgreSQL | ALTER TABLE old RENAME TO new | 事務安全 |
| Oracle | RENAME old TO new | DDL 隱式提交 |
| HSQLDB | ALTER TABLE old RENAME TO new | |
| SQLite | ALTER TABLE old RENAME TO new | |
| DB2 | RENAME TABLE old TO new | |
⚠️ 生產環境注意
- 鎖表風險:重命名持有排他鎖,避開高峰期
- 相依物件:視圖、SP、FK、觸發器引用舊表名將失效,需同步修改
- 權限:需
ALTER / CONTROL 權限
- 事務:Oracle 隱式提交,無法回滾;其他多支援事務