【发布时间】:2011-02-23 21:12:51
【问题描述】:
我最近将一个数据库从 windows 机器转移到了 linux 机器。这些表在小写和大写名称之间混合使用。我需要一种将所有表和列重命名为小写的方法。这可能吗?
我在this SO answer 中看到了表是可能的,但没有找到任何处理列名的东西。
【问题讨论】:
-
+1,CamelCase 让你的世界颠倒......
我最近将一个数据库从 windows 机器转移到了 linux 机器。这些表在小写和大写名称之间混合使用。我需要一种将所有表和列重命名为小写的方法。这可能吗?
我在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}'
【讨论】:
describe **tablename** 显示大写列。
您可以使用 Anders Eriksson 在MySQL Website 上提出的这个脚本:
select concat('rename table ', table_name, ' to ' , lower(table_name) , ';') from information_schema.tables 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);
【讨论】:
上述解决方案对我来说还不够完整。他们删除了 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'
省时注意事项: 要输出到文件,您必须以足够的权限登录到数据库。 我有 root 访问权限,所以我以 root 身份登录,但如果你必须的话,剪切和过去的结果也可以。
【讨论】:
好的,我已经修改了 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'
【讨论】:
@Dave Benson 的更好版本,它只获取您的数据库表并修复 Current_timestamp
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, 'NULL DEFAULT NULL', IF (COLUMN_DEFAULT = 'CURRENT_TIMESTAMP', 'NULL DEFAULT CURRENT_TIMESTAMP', CONCAT(' NULL 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
USING(`table_name`, `table_schema`)
WHERE t.table_schema = 'YOUR_DATABASE_NAME'
ORDER BY `TABLE_NAME` ASC
【讨论】: