首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 批次將表名轉大寫:儲存程序實作與大小寫敏感設定

     編輯:MySQL 資料庫相關知識

前置條件

MySQL 預設在 Windows 不區分大小寫、Linux 區分。若需強制區分,需在 my.cnf [mysqld] 區段設定:

lower_case_table_names = 0  -- 0=區分大小寫, 1=不區分(預設 Windows), 2=存儲小寫但比較不區分

修改後必須重啟 MySQL 服務。

儲存程式碼:批次重命名為大寫

DROP PROCEDURE IF EXISTS uppercase_tables;
CREATE PROCEDURE uppercase_tables(IN dbname VARCHAR(200))
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE oldname VARCHAR(200);
  DECLARE cur CURSOR FOR
    SELECT table_name FROM information_schema.TABLES
    WHERE table_schema = dbname;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

  OPEN cur;
  REPEAT
    FETCH cur INTO oldname;
    SET @newname = UPPER(oldname);
    -- 二進位比較確保大小寫不同才重命名
    SET @isNotSame = @newname <> BINARY oldname;
    IF NOT done AND @isNotSame THEN
      -- 兩步重命名避免大小寫衝突:先改臨時名,再改目標名
      SET @SQL = CONCAT('RENAME TABLE `', oldname, '` TO `', LOWER(@newname), '_tmp`');
      PREPARE tmpstmt FROM @SQL; EXECUTE tmpstmt;
      SET @SQL = CONCAT('RENAME TABLE `', LOWER(@newname), '_tmp` TO `', @newname, '`');
      PREPARE tmpstmt FROM @SQL; EXECUTE tmpstmt;
      DEALLOCATE PREPARE tmpstmt;
    END IF;
  UNTIL done END REPEAT;
  CLOSE cur;
END;

執行方式

CALL uppercase_tables('your_database_name');

關鍵設計細節

  1. 使用 BINARY 比較確保 user vs USER 被視為不同
  2. 雙重 RENAME 繞過檔案系統大小寫不敏感限制(先改小寫臨時名,再改大寫)
  3. 游標遍歷 information_schema.TABLES 獲取當前 schema 所有表

驗證結果

SHOW TABLES; -- 應顯示全大寫表名
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved