规范化 - 将数据迁移到另一个表

时间:2016-09-15 12:47:36

标签: mysql sql normalization

我有一个表template,其中包含字段json。由于许多json(1:n)template可以相同,因此我创建了另一个表template_json,并将字段template_json_id(FK)添加到template

要将所有数据从一个表迁移到我使用以下SQL的antoher:

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

这会完美地迁移数据,但当然会将template.template_json_id留空。我需要从插入内容更新每行template.template_json_id(FK)和template_json.id

是否可以在一个查询中执行此操作?

2 个答案:

答案 0 :(得分:1)

如果您没有重复,则可以使用内部联接更新

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

如果您有重复,则应填充选择不同的

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

答案 1 :(得分:1)

好的,这将是一个多步骤的过程。您已经创建了新表并填充了它。下一步是消除重复。有很多不同的方法可以做到这一点,我想到的是:

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;