2016-09-15 8 views
0

テーブルtemplateにフィールドjsonがあります。 は多くの場合同じものであることがありますのでtemplate(1:n)テーブルtemplate_jsonを別に作成し、フィールドtemplate_json_id(FK)をtemplateに追加しました。私はSQL次使用antoherに一つのテーブルからすべてのデータを移行するには正規化 - データを別のテーブルに移行する

INSERT INTO db.template_json (`json`) 
SELECT `json` 
FROM db.template; 

これは完全にデータを移行し、もちろん私のtemplate.template_json_id空を残します。私は各行の(FK)をtemplate_json.idで更新する必要があります。

これを1回のクエリで実行できますか?

+0

重複はありますか? – e4c5

+0

jsonの多くは重複しています、はい –

+0

template_jsonテーブルに自動インクリメントプライマリキーを追加しましたか? – e4c5

答えて

1

あなたは、内部で使用して更新することができます重複していない場合は、[OK]を

INSERT INTO db.template_json (`json`) 
SELECT distinct `json` 
FROM db.template; 
+0

これはおそらく移行のために行います。 jsonは実際に重複しています。 –

+0

私は答えを更新しています.. – scaisEdge

1

SELECT DISTINCTを取り込む必要があり、重複している場合

update template 
inner join template on template_json.json = template.json 
set template.template_json_id = template_json.id; 

に参加し、これがために起こっています多段階のプロセスであること。あなたはすでに新しいテーブルを作成し、それを移入しました。次のステップは重複を排除することです。これを行うにはさまざまな方法がありますが、私の考えには、次のようなものがあります。

DELETE FROM template_json WHERE id in (SELECT * FROM (SELECT id FROM template_json GROUP BY json HAVING COUNT(*) > 1) as A); 

これは非常に遅い可能性があります。次のステップは、既存のテーブルを更新することです。

UPDATE template 
INNER JOIN template_json on template_json.json = template.json 
SET template.template_json_id = template_json.id; 

これもやや遅くなる可能性があります。 json列のインデックスが役立つかもしれません。最後に、バックアップを取った後。

ALTER TABLE template DROP COLUMN json; 
関連する問題