将列名转换为小写的MYSQL脚本

将列名转换为小写的MYSQL脚本,mysql,scripting,renaming,Mysql,Scripting,Renaming,我正在寻找一个单独的MYSQL脚本,将数据库中的所有列名一次性转换为小写 我继承了一个MYSQL数据库,它有很多大小写混合的列名(150个表有一个奇怪的命名约定),我不想为了实现这一点而逐个手动检查每个表 有人有这样的剧本吗 谢谢您可以通过构建脚本来解决此任务,从以下语句的输出开始: SELECT table_name, column_name, data_type FROM information_schema.columns WHERE table_schema = 'dbname'; OR

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

我继承了一个MYSQL数据库,它有很多大小写混合的列名(150个表有一个奇怪的命名约定),我不想为了实现这一点而逐个手动检查每个表

有人有这样的剧本吗


谢谢

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

SELECT table_name, column_name, data_type
FROM information_schema.columns
WHERE table_schema = 'dbname';
ORDER BY table_name
有关此功能的详细信息可在此处找到“”

然后你可以使用ALTER表格。。更改功能以更改列的名称

e、 g

另见“

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

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

如果其他任何人需要以下已完成查询的示例,请在使用之前进行测试

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

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;
选择CONCAT(
“更改表格”,表格名称,
“更改”,列名称,
下部(列名称),'',列类型,'',额外,
CASE WHEN_NULLABLE='YES'然后'NULL'否则'NOT NULL'END';')作为行
从信息_schema.columns
其中表_schema=“”
和数据类型('char','varchar','INT','TINYINT','datetime','text','double','decimal')
电话订购;
未来的某个人。。。
顺便说一句,视图也在此处编写脚本,因此您可能需要将它们从最终的SQL代码中删除您可以通过将以下正则表达式应用于SQL转储(例如,由
mysqldump
生成的转储),将所有表名和列名重命名为小写:

这是因为所有表名和列名都用“`”(反勾号)包装。最好仅在模式上执行此操作,与数据分离(仅使用表结构,然后执行插入)

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

:%s/`\(\w\+\)`/\L&/g
或者在命令行中使用
sed

sed 's/`\(\w\+\)`/\L&/g' input.sql > output.sql
如果需要重复执行此操作,请将表达式存储在文本文件中,并按如下方式调用它:

sed -f regex.txt input.sql > output.sql

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

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

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


在我的例子中,我需要列名全部小写,因为我的开发环境会自动将first_name转换为first name:作为数据输入的字段标签。如果我将它们保留为大写(我继承了大写),它们将转换为我不想要的名字,我将不得不更改我所有的字段标签。

我无法测试它,但我很高兴我很接近:)我们将在mysql 5.7中得到这个错误“错误1054(42S22):未知列‘字段列表’中的‘数据类型’。使用“数据类型”,但不要使用“数据类型”。如果你有一个完整的解决方案,你可能应该将它添加到你的问题中,这样其他人就可以更容易地找到它。你去那里,它不是很完美,但足够接近!想打倒选民,想知道你为什么投了反对票。欢迎发表意见,谢谢这对我帮助很大。非常感谢。谢谢你的编辑。现在它非常有用。
sed 's/`\(\w\+\)`/\L&/g' input.sql > output.sql
sed -f regex.txt input.sql > output.sql