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

Rip*_*ppo 6 mysql scripting renaming

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

我继承了一个MYSQL数据库,该数据库有很多混合大小写的列名(150个表有一个奇怪的命名约定),我不希望通过表手动完成每个表来执行此操作.

有人有这样的剧本吗?

谢谢

Rip*_*ppo 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;
Run Code Online (Sandbox Code Playgroud)

HTH将来有人... BTW视图也在这里编写脚本,因此您可能需要将它们从最终的SQL代码中取出


lep*_*epe 6

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

s/`\(\w\+\)`/\L&/g
Run Code Online (Sandbox Code Playgroud)

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

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

:%s/`\(\w\+\)`/\L&/g
Run Code Online (Sandbox Code Playgroud)

或者使用sed以下命令从命令行执行:

sed 's/`\(\w\+\)`/\L&/g' input.sql > output.sql
Run Code Online (Sandbox Code Playgroud)

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

sed -f regex.txt input.sql > output.sql
Run Code Online (Sandbox Code Playgroud)


Adr*_*ian 2

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

SELECT table_name, column_name, data_type
FROM information_schema.columns
WHERE table_schema = 'dbname';
ORDER BY table_name
Run Code Online (Sandbox Code Playgroud)

有关此功能的详细信息可以在此处找到“ MYSQL::INFORMATION_SCHEMA COLUMNS 表

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

例如

ALTER TABLE mytable CHANGE old_name new_name varchar(5);
Run Code Online (Sandbox Code Playgroud)

另请参阅“ 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
Run Code Online (Sandbox Code Playgroud)