2017-03-31 49 views
0

我感动的老螳螂表有一个varchar(64)CATEGORY_ID列具有int(10)CATEGORY_ID列一个新的螳螂表。MySQL的移动从varchar表为int

简化的结构如下

bug_table(旧DB)

+----+-------------+-------------+--------+ | id | project_id | category_id | report | +----+-------------+-------------+--------+ | 1 | 0 | Server | crash | | 2 | 0 | Database | error | | 3 | 1 | Server | bug | | 4 | 1 | Server | crash | +----+-------------+-------------+--------+

category_table(新DB)

+----+------------+----------+ | id | project_id | name | +----+------------+----------+ | 0 | 1 | Server | | 1 | 1 | Database | | 2 | 2 | Server | | 3 | 2 | Database | +----+------------+----------+

我需要一个神奇的查询将取代category_idbug_table与数字category_idcategory_table。幸运的是,我可以匹配project_idname的类别。

这是我的工作,但已经得到了卡在复杂

UPDATE bug_table b SET b.category_id = c.id USING category_table WHERE b.category_id = c.name

回答

0

我喜欢不同于你一个新的查询/参考表做处理这一一点任务查询。

  1. 对我而言,新的类别表只有id和name列。基于样本数据只有两行:服务器和数据库。是的,我意识到可能有其他名称,但在继续最大化随后的id匹配之前,可以轻松地添加这些名称,并且应该添加它们。

  2. 接下来,我会添加一个新的列到bug表中,可以被称为'category_new'与数据类型,将存储新的类别id。或者,您可以将现有的category_id列重命名为category,并且id的新列可以是column_id。

  3. 毕竟做到这一点,那么你可以通过连接上名称类别更新新列,并设置相匹配的ID:(这是假定在步骤2中提到的 - 其它方法)

    UPDATE bug_table JOIN category_table ON bug_table.category_id = category_table.name 
    SET bug_table.category_new = category_table.id 
    
  4. 之后运行,检查新列以验证更新的ID。

  5. 最后,在成功更新之后,现在可以删除bugs_table中旧的category_id列(带有名称),并且可以将category_new列重命名为category_id。

=====

请注意,如果你决定去与提到的其它列的方式,当然查询将是类似的,但略有不同。然后在最后只需要一个列删除

如果还有其他表应用相同的类别更改,则操作(基本上步骤2到5)对于这些表也是类似的。

+0

谢谢,我会给这个镜头。然而,project_id是不可或缺的,它是Mantis表的一部分,每个项目都有自己的类别。 – yallo