2016-10-28 6 views
0

私は多くの(50+)列を持つテーブル(テキストの国際化のため)を継承しました。構造は多くの列を持つテーブルを再設計する

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

ないすべてのテキストは、すべての言語および変異で必要とされるように、これは望ましくないが、テキストが追加され、私は定期的に列を追加するには、[OK]であることを感じていないです。

私はシンプルな構造にデータを再フォーマットしたいと思います:

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は失われることがありますが、まったく使用されていません。

INSERT … SELECTステートメント、おそらくSHOW COLUMNSクエリを使用して50回以上繰り返すよりスマートな方法が必要ですが、正しい構文が見つからない場合があります。

これは私のすべての列名になるだろう(彼らは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列をインポートします

しかし私はそれらの2つに加わることができません。

+0

古いテーブルから新しいテーブルに既存のデータを取得しようとしていますか? – blackpen

+0

正確に。古い構造は言語全体に対して1つの行を持っています、私は単一のテキストごとに1つの行を持っています(彼らはususally短いラベルです)。 –

+0

'info_schema'からのすべての' INSERT ... SELECT'クエリを文字列に生成し、 'PREPARE'と' EXECUTE'を使ってそれを実行する動的SQLを書く必要があります。これがワンタイムコンバージョンの場合、これは価値があるよりも多くの作業のようです。すべてのクエリを生成するために 'awk'のようなものを使用してください。 – Barmar

答えて

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 
関連する問題