我继承了一个包含许多(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_hint
,mail_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 ) ;
但我无法加入这两个人。
答案 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