2011-02-23 72 views
9

我最近將一個數據庫從一個windows box轉移到一個linux box。這些表格混合在小寫和大寫的名字之間。我需要一種方法將所有表和列重命名爲小寫。那可能嗎?Mysql - 將所有表和列重命名爲小寫?

我在this SO answer看到有可能使用表格,但沒有找到任何處理列名稱的東西。

+0

+1,CamelCase讓你的世界顛倒...... – ajreal 2011-02-23 21:17:43

回答

11

你可以嘗試做同樣的事情與INFORMATION_SCHEMA.COLUMNS表

編輯: 喜歡的東西

SELECT CONCAT('ALTER TABLE ', TABLE_NAME, ' CHANGE `', COLUMN_NAME, '` `', 
LOWER(COLUMN_NAME), '` ', COLUMN_TYPE, ';') 
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '{your schema name}' 
+0

似乎沒有工作;命令似乎已經成功,但「describe ** tablename **」顯示大寫的列。 – aendrew 2012-01-29 00:06:21

+0

授予,也許我只需要重新啓動MySQL。我在共享主機上這樣做,所以不確定是否是這種情況。 – aendrew 2012-01-29 00:12:32

+0

+1它爲我工作。 – 2012-04-13 11:30:15

7

您可以在MySQL Website使用由安德斯·埃裏克森提出的這個腳本:

select concat('rename table ', table_name, ' to ' , lower(table_name) , ';') from information_schema.tables where table_schema = 'your_schema_name'; 
+0

所以,當我這樣做並運行後續結果時,它告訴我表已經存在。 – dbinott 2015-09-11 17:56:00

1

將上述溶液不適合我完全夠。他們刪除了諸如auto_increment,默認值和Not Null之類的列屬性。另外,我不想更改information_schema和mysql中的列。我不研究所有列屬性組合。只是允許我轉換數據庫的設置。數據庫中可能會有更多的常量,如CURRENT_TIMESTAMP。

我用下面的幾個變體來確定我的數據庫中有什麼。

SELECT distinct COLUMN_DEFAULT FROM information_schema.columns 

這是爲我工作的解決方案:

select 
CONCAT('ALTER TABLE ', '`', t.TABLE_NAME, '`', ' CHANGE `', c.COLUMN_NAME, '`', 
    ' `', LOWER(`COLUMN_NAME`), '` ', COLUMN_TYPE, 
IF (IS_NULLABLE = "YES", ' ', ' NOT NULL'), 
IF (IS_NULLABLE = "YES", 
    IF (COLUMN_DEFAULT IS NULL, 'DEFAULT NULL', IF (COLUMN_DEFAULT = 'CURRENT_TIMESTAMP', ' DEFAULT CURRENT_TIMESTAMP', CONCAT(' DEFAULT ', '''', COLUMN_DEFAULT, ''''))), 
    IF (COLUMN_DEFAULT IS NOT NULL, IF (COLUMN_DEFAULT = 'CURRENT_TIMESTAMP', ' DEFAULT CURRENT_TIMESTAMP', CONCAT(' DEFAULT ', '''', COLUMN_DEFAULT, '''')), '')) , 
' ', EXTRA, ';') 
from 
information_schema.tables t 
JOIN 
information_schema.columns c 
ON (c.table_name = t.table_name) 
WHERE t.table_type = 'BASE TABLE' 
AND t.table_schema not in ('information_schema', 'mysql') 
INTO OUT FILE '/tmp/ColumnsToLowerCase.sql' 

節省時間註釋: 輸出到你必須登錄到具有足夠權限的數據庫中的文件。 我有根訪問權限,因此我以根用戶身份登錄,但如果必須切入和過去的結果也可以工作。

+0

這工作得很好,但我需要添加DISTINCT關鍵字到選擇,否則我有重複記錄返回。 – omarjebari 2017-08-13 10:55:24

1

好的,我修改了Dave Benson的答案,添加了DISTINCT關鍵字(以防止重複記錄被返回),並且還檢查可爲空的時間戳列。

SELECT DISTINCT 
    CONCAT('ALTER TABLE ', '`', t.TABLE_NAME, '`', ' CHANGE `', c.COLUMN_NAME, '`', ' `', LOWER(`COLUMN_NAME`), '` ', COLUMN_TYPE, 
IF (IS_NULLABLE = "YES", ' ', ' NOT NULL'), IF (IS_NULLABLE = "YES", IF (COLUMN_DEFAULT IS NULL, IF (COLUMN_TYPE = 'TIMESTAMP', 'NULL DEFAULT NULL', 'DEFAULT NULL'), IF (COLUMN_DEFAULT = 'CURRENT_TIMESTAMP', ' DEFAULT CURRENT_TIMESTAMP', CONCAT(' DEFAULT ', '''', COLUMN_DEFAULT, ''''))), IF (COLUMN_DEFAULT IS NOT NULL,IF (COLUMN_DEFAULT = 'CURRENT_TIMESTAMP', ' DEFAULT CURRENT_TIMESTAMP', CONCAT(' DEFAULT ', '''', COLUMN_DEFAULT, '''')),'')), ' ', EXTRA, ';') 
FROM information_schema.tables t 
JOIN information_schema.columns c ON (c.table_name = t.table_name) 
WHERE t.table_type = 'BASE TABLE' 
AND c.table_schema not in ('information_schema', 'mysql') 
INTO OUT FILE '/tmp/ColumnsToLowerCase.sql'