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

Normalization - Migrate Data to Another Table

我有一个 table template 字段 json。由于 json 对于许多 template (1:n) 可能相同,我创建了另一个 table template_json 并将字段 template_json_id (FK) 添加到 template.

为了将所有数据从一个 table 迁移到另一个我使用了以下 SQL:

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

这完美地迁移了数据,但当然让我的 template.template_json_id 为空。我需要用插入的 template_json.id 更新每一行的 template.template_json_id (FK)。

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

如果您没有重复项,您可以使用内部联接并进行更新

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

如果您有重复项,您应该填充一个 select 不同的

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

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

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

这可能会很慢。下一步是更新现有的 table.

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;