首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

JDBC 判斷資料表是否存在 + 重命名表 (SQL Server / MySQL / HSQLDB 多資料庫適配)

     編輯:關於SqlServer

一、判斷表是否存在 (標準 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 ServerEXEC sp_rename 'old', 'new'需單引號,可跨 Schema
MySQLALTER TABLE old RENAME TO new或 RENAME TABLE old TO new
PostgreSQLALTER TABLE old RENAME TO new事務安全
OracleRENAME old TO newDDL 隱式提交
HSQLDBALTER TABLE old RENAME TO new
SQLiteALTER TABLE old RENAME TO new
DB2RENAME TABLE old TO new

⚠️ 生產環境注意

  1. 鎖表風險:重命名持有排他鎖,避開高峰期
  2. 相依物件:視圖、SP、FK、觸發器引用舊表名將失效,需同步修改
  3. 權限:需 ALTER / CONTROL 權限
  4. 事務:Oracle 隱式提交,無法回滾;其他多支援事務
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved