从mysql中的所有列名称中删除下划线

时间:2015-07-02 15:53:11

标签: mysql

我表中的所有列名都有下划线。我想从每列中删除此下划线并替换为空格。我知道我可以用这样的东西(也许)一次做这一列,但这可能只是为条目而不是列名做:

UPDATE photos  SET caption = REPLACE(caption,'_',' ')

但是,我有70列,一次更新一列需要一段时间。这有什么捷径吗?

2 个答案:

答案 0 :(得分:0)

选项1 :让MySQL创建一个自动生成的SELECT语句,其中包含所有列名(或者其他适合您的名称),然后使用正则表达式创建一个长SQL命令。

例如:

column1
column_2
...

正则表达式查找:\([A-Za-z0-9]*\)_([A-Za-z0-9]*\)(仅假设一个下划线,根据需要调整)

正则表达式替换:ALTER TABLE xyz CHANGE [\1_\2] [\1 \2] <type>;

或者,选项2

您可以使用以下内容迭代列名:mysql, iterate through column names

DECLARE col_names CURSOR FOR
  SELECT column_name
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE table_name = 'tbl_name'
  ORDER BY ordinal_position;


select FOUND_ROWS() into num_rows;

SET i = 1;
the_loop: LOOP

   IF i > num_rows THEN
        CLOSE col_names;
        LEAVE the_loop;
    END IF;


    FETCH col_names 
    INTO col_name;     

     //do whatever else you need to do with the col name

    SET i = i + 1;  
END LOOP the_loop;

答案 1 :(得分:0)

将表/列名称列表转储到文件中。使用它作为执行70 ALTER TABLE语句并执行该语句的.sql脚本的基础。

所以如果你创建一个这样的文件:

users this_column
sales that_column
products other_column

然后像这样的Perl程序:

while (<>) {
    chomp;
    my ($table,$oldname) = split / /;

    my $newname = $oldname;
    $newname =~ s/_//g;

    print "ALTER TABLE $table RENAME $oldname TO $newname;\n";
}

然后像这样运行:

perl rename.pl names.txt > rename.sql

你最终会得到一个像这样的SQL脚本:

ALTER TABLE users RENAME this_column TO thiscolumn;
ALTER TABLE sales RENAME that_column TO thatcolumn;
ALTER TABLE products RENAME other_column TO othercolumn;

然后您可以传递给MySQL客户端。

它没有在SQL中使用它,但它比乱用MySQL数据字典要麻烦得多。

注意:我还没有测试输出,看看实际生成的MySQL是否有效。它只是说明。