Mysql重新设计表与许多列

时间:2016-10-28 15:49:40

标签: mysql data-structures

我继承了一个包含许多(50+)列的表(用于文本国际化)。结构是

text_id | lang_id | text1 | text2 | text3 | …
----------------------------------------------
1       |       1 | valA1 | valA2 | valA3 | …
2       |       2 | valB1 | valB2 | valB3 | …

这是不可取的,因为并非所有语言都需要所有文本和突变,文本被添加,我觉得不能定期添加列。

我想将数据重新格式化为一个简单的结构:

new_text_id | lang_id | name  | value
-------------------------------------
          1 |       1 | text1 | valA1
          2 |       1 | text2 | valA2
…
         61 |       2 | text1 | valB1
         62 |       2 | text2 | valB2
…

等等。

旧的text_id可能会丢失,根本不会被使用。

必须有一种更聪明的方法来执行此操作,而不是50次重复INSERT … SELECT语句,最有可能使用SHOW COLUMNS查询,但我找不到正确的语法。

这会获取所有列名称(实际上它们未命名为text1,但例如mail_hintmail_cancelled等。)

SELECT COLUMN_NAME 
    FROM information_schema.COLUMNS 
    WHERE 
        TABLE_NAME = 'texts' AND 
        TABLE_SCHEMA = 'my_database' AND 
        COLUMN_NAME <> 'text_id' AND
        COLUMN_NAME <> 'lang_id';

这会将一列导入新结构

INSERT INTO texts2 (lang_id, name, value) 
    ( SELECT lang_id, 'text1' AS name, text1 AS value FROM texty ) ;

但我无法加入这两个人。

1 个答案:

答案 0 :(得分:0)

使用简单脚本创建所有重复查询。这是一个bash脚本:

for i in {1..50}; do
    echo "INSERT INTO texts2 (lang_id, name, value) 
        ( SELECT lang_id, 'text$i' AS name, text$i AS value FROM texty ) ;"
done | mysql -u username -ppassword dbname