代码之家  ›  专栏  ›  技术社区  ›  Rippo

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

  •  6
  • Rippo  · 技术社区  · 15 年前

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

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

    有人有这样的剧本吗?

    谢谢

    4 回复  |  直到 9 年前
        1
  •  2
  •   Kzqai    11 年前

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

    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表。更改功能以更改列的名称

    例如

    ALTER TABLE mytable CHANGE old_name new_name varchar(5);
    

    也见“ MYSQL::ALTER TABLE Syntax 他说:“这是一个很好的选择。”

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

    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
    
        2
  •  6
  •   Diego Vieira Rippo    10 年前

    如果下面有其他人想要的是已完成查询的示例,请在使用….

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

    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;
    

    将来有人… btw视图也在这里编写脚本,因此您可能需要将它们从最终的SQL代码中去掉。

        3
  •  6
  •   bdash    9 年前

    通过将以下正则表达式应用于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
    
        4
  •  3
  •   Steve Wood    12 年前

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

    我做了一个sqldump,它在表名和列名周围放置回线,然后使用notepad++搜索(`.`),并替换为\l\1。它将我的所有表名和列名都转换为小写。

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

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