2016-09-15 59 views
0

我有一個表template與字段json。由於json對於許多template(1:n)可以是相同的,我創建了另一個表template_json並將字段template_json_id(FK)添加到template標準化 - 將數據遷移到另一個表

從一個表遷移所有數據antoher我用下面的SQL:

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

這完全遷移數據,但當然我留下空template.template_json_id。我需要從插入內容更新每行template.template_json_id(FK)template_json.id

是否有可能在一個查詢中做到這一點?

+0

你有重複嗎? – e4c5

+0

很多json都是重複的,是的 –

+0

你有沒有爲template_json表添加一個自動增量主鍵? – e4c5

回答

1

如果沒有重複,你可以使用和更新內部聯接

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

如果您有重複的,你應該用SELECT DISTINCT

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

這可能會用於遷移。 json實際上有重複。 –

+0

我已更新答案.. – scaisEdge

1

OK,這是怎麼回事填充到成爲一個多步驟的過程。您已經創建了新表並填充它。下一步是消除重複。有很多不同的方式來做到這一點,我想到的是:

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; 
相關問題