【问题标题】:Normalization - Migrate Data to Another Table规范化 - 将数据迁移到另一个表
【发布时间】:2017-01-23 11:58:00
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你有重复的吗?
  • 很多 json 是重复的,是的
  • 你是否在 template_json 表中添加了自增主键?
  • 是的,id int(11) NOT NULL AUTO_INCREMENT

标签: mysql sql normalization


【解决方案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;

【讨论】:

  • 这可能会用于迁移。 json 实际上有重复。
【解决方案2】:

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

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多