我最近將一個數據庫從一個windows box轉移到一個linux box。這些表格混合在小寫和大寫的名字之間。我需要一種方法將所有表和列重命名爲小寫。那可能嗎?Mysql - 將所有表和列重命名爲小寫?
我在this SO answer看到有可能使用表格,但沒有找到任何處理列名稱的東西。
我最近將一個數據庫從一個windows box轉移到一個linux box。這些表格混合在小寫和大寫的名字之間。我需要一種方法將所有表和列重命名爲小寫。那可能嗎?Mysql - 將所有表和列重命名爲小寫?
我在this SO answer看到有可能使用表格,但沒有找到任何處理列名稱的東西。
你可以嘗試做同樣的事情與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}'
可以用於內置函數LOWER()UPPER()。 http://www.sqlinfo.net/mysql/mysql_function_upper_lower.php
alter table [table name] change [old column name] [new column name] varchar (50);
您可以在MySQL Website使用由安德斯·埃裏克森提出的這個腳本:
select concat('rename table ', table_name, ' to ' , lower(table_name) , ';') from information_schema.tables where table_schema = 'your_schema_name';
所以,當我這樣做並運行後續結果時,它告訴我表已經存在。 – dbinott 2015-09-11 17:56:00
將上述溶液不適合我完全夠。他們刪除了諸如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'
節省時間註釋: 輸出到你必須登錄到具有足夠權限的數據庫中的文件。 我有根訪問權限,因此我以根用戶身份登錄,但如果必須切入和過去的結果也可以工作。
這工作得很好,但我需要添加DISTINCT關鍵字到選擇,否則我有重複記錄返回。 – omarjebari 2017-08-13 10:55:24
好的,我修改了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'
+1,CamelCase讓你的世界顛倒...... – ajreal 2011-02-23 21:17:43