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_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) ;
に1列をインポートします
しかし私はそれらの2つに加わることができません。
古いテーブルから新しいテーブルに既存のデータを取得しようとしていますか? – blackpen
正確に。古い構造は言語全体に対して1つの行を持っています、私は単一のテキストごとに1つの行を持っています(彼らはususally短いラベルです)。 –
'info_schema'からのすべての' INSERT ... SELECT'クエリを文字列に生成し、 'PREPARE'と' EXECUTE'を使ってそれを実行する動的SQLを書く必要があります。これがワンタイムコンバージョンの場合、これは価値があるよりも多くの作業のようです。すべてのクエリを生成するために 'awk'のようなものを使用してください。 – Barmar