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

MySQL 將資料表名稱轉為大寫的預存程序實作

     編輯:MySQL 綜合教學

MySQL 將資料表名稱轉為大寫的預存程序實作

MySQL 在 Linux 下預設區分大小寫(lower_case_table_names=0)。本文提供預存程序,批次將指定資料庫下所有資料表名稱轉為大寫。

前置條件

  • MySQL 設定 lower_case_table_names=0(區分大小寫)
  • 擁有 ALTER、SELECT 權限於 information_schema

預存程序程式碼

DROP PROCEDURE IF EXISTS uppercase;
CREATE PROCEDURE uppercase(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('你的資料庫名稱');

原理說明

  1. 游標遍歷 information_schema.TABLES 取得所有表名
  2. 比對 UPPER(name) 與原名(BINARY 區分大小寫)
  3. 兩次 RENAME 避免大小寫不敏感系統下衝突
  4. 動態 SQL(PREPARE/EXECUTE)執行 DDL

注意事項

  • 僅修改表名,不影響欄位、索引、外鍵定義
  • 外鍵參考表名若同步修改需額外處理
  • 生產環境執行前請完整備份
  • Windows 預設不區分大小寫,此程序無效果
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved