我正在寻找一个MYSQL脚本,将数据库中的所有列名称一次性转换为小写...
我继承了一个MYSQL数据库,该数据库有很多混合大小写的列名(150个表有一个奇怪的命名约定),我不想手动逐个表来执行此操作。
有人有这样的剧本吗?
由于
答案 0 :(得分: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未来有人......
BTW视图也在这里编写脚本,因此您可能需要将它们从最终的SQL代码中删除
答案 1 :(得分: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
答案 2 :(得分:3)
lepe提出的解决方案确实是唯一安全的方法。脚本方法太危险,易于导出或处理错误的数据定义。上面的所有示例脚本都省略了几种数据类型,因此它们不完整。
我做了一个sqldump,它在表和列名称周围放置了反引号,然后使用Notepad ++搜索(`。*`)和替换为\ L \ 1。这使我的所有表名和列名都变成小写。
然后我备份了我的数据库,清除了所有表,然后执行了我的.sql文件来重建。我并不担心结构与数据分离,因为我发现在我的任何数据中都没有出现反引号符号。
在我的情况下,我需要将列名全部小写,因为我的开发环境会自动将first_name转换为First Name:作为数据输入的字段标签。如果我把它们留作帽子(我继承了),它们会转换为FIRST NAME,这不是我想要的,我必须改变我的所有字段标签。
答案 3 :(得分: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功能更改列的名称
e.g。
ALTER TABLE mytable CHANGE old_name new_name varchar(5);
另请参阅“MYSQL::ALTER TABLE Syntax”
不同的数据类型有不同的要求,因此您需要UNIONs:
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