7

我正在寻找一个 MYSQL 脚本来一次性将数据库中的所有列名转换为小写...

我继承了一个 MYSQL 数据库,它有很多混合大小写的列名(150 个表,命名约定很奇怪),我不想逐个表手动检查每个表来执行此操作。

有人有这样的剧本吗?

谢谢

4

4 回答 4

6

如果其他人想要以下是已完成查询的示例,请在使用前进行测试.....

根据要求编辑完成的解决方案

SELECT CONCAT(
'ALTER TABLE ', table_name, 
' CHANGE ', column_name, ' ', 
LOWER(column_name), ' ', column_type, ' ', extra,
CASE WHEN IS_NULLABLE = 'YES' THEN  ' NULL' ELSE ' NOT NULL' END, ';') AS line
FROM information_schema.columns
WHERE table_schema = '<DBNAME>' 
AND data_type IN ('char', 'varchar','INT', 'TINYINT', 'datetime','text','double','decimal')
ORDER BY line;

HTH 将来有人......顺便说一句,这里也编写了脚本,因此您可能需要将它们从最终的 SQL 代码中删除

于 2009-10-23T13:05:55.977 回答
6

您可以通过将以下正则表达式应用于 SQL 转储(例如,由 生成的转储mysqldump)将所有表和列名称重命名为小写:

s/`\(\w\+\)`/\L&/g

这是有效的,因为所有表名和列名都由 ``(反引号)包裹。最好仅在模式上执行此操作,与数据分开(仅使用表结构,然后进行插入)。

要在 Vim 中执行此操作,请打开 SQL 转储并输入以下命令:

:%s/`\(\w\+\)`/\L&/g

或者从命令行使用sed

sed 's/`\(\w\+\)`/\L&/g' input.sql > output.sql

如果您需要重复执行此操作,请将表达式存储在文本文件中,并按如下方式调用它:

sed -f regex.txt input.sql > output.sql
于 2011-03-01T02:16:56.793 回答
3

lepe 提出的解决方案确实是唯一安全的方法。脚本方法太危险,容易导出或处理错误的数据定义。上面的所有示例脚本都省略了几种数据类型,因此它们是不完整的。

我做了一个 sqldump,它在表名和列名周围放置反引号,然后使用 Notepad++ 搜索 (`.*`) 并替换为 \L\1。这将我所有的表名和列名都变成了小写。

然后我备份了我的数据库,清除了所有的表,然后执行了我的 .sql 文件进行重建。我不担心将结构与数据分开,因为我发现我的任何数据中都没有出现反引号符号。

在我的情况下,我需要我的列名全部小写,因为我的开发环境会自动将 first_name 转换为 First Name: 作为数据输入的字段标签。如果我将它们保留为大写字母(我继承了它),它们将转换为我不想要的名字,我必须更改我所有的字段标签。

于 2012-11-02T04:05:11.407 回答
2

您可以通过构建脚本来解决此任务,从该语句的输出开始:

SELECT table_name, column_name, data_type
FROM information_schema.columns
WHERE table_schema = 'dbname';
ORDER BY table_name

有关此功能的详细信息,请参见“ MYSQL::The INFORMATION_SCHEMA COLUMNS Table

然后您可以使用 ALTER TABLE .. CHANGE 功能来更改列的名称

例如

ALTER TABLE mytable CHANGE old_name new_name varchar(5);

另请参阅“ MYSQL::ALTER TABLE 语法

不同的数据类型有不同的要求,因此您需要 UNION:

SELECT 'ALTER TABLE '||table_name||' CHANGE '|| column_name||' '||lower(column_name)||' '||datatype||'('||CHAR(character_maximum_length)||');' AS Line
    FROM information_schema.columns
    WHERE table_schema = dbname and datatype in ( 'CHAR', 'VARCHAR' )
    ORDER BY table_name
    UNION
SELECT 'ALTER TABLE '||table_name||' CHANGE '|| column_name||' '||lower(column_name)||' '||datatype||'('||CHAR(numeric_precision)||');' AS Line
    FROM information_schema.columns
    WHERE table_schema = dbname and datatype in ( 'INTEGER' )
    ORDER BY table_name
    UNION
SELECT 'ALTER TABLE '||table_name||' CHANGE '|| column_name||' '||lower(column_name)||' '||datatype||'('||CHAR(numeric_precision)||','||CHAR(numeric_scale)|');' AS Line
    FROM information_schema.columns
    WHERE table_schema = dbname and datatype in ( 'FLOAT' )
    ORDER BY table_name
    UNION
SELECT 'ALTER TABLE '||table_name||' CHANGE '|| column_name||' '||lower(column_name)||' '||datatype||');' AS Line
    FROM information_schema.columns
    WHERE table_schema = dbname and datatype in ( 'DATE' )
    ORDER BY table_name
于 2009-10-23T11:28:54.220 回答