MySQL将表从varchar移动到int

时间:2017-03-31 19:31:07

标签: mysql

我正在将具有varchar(64) category_id 列的旧Mantis表移动到具有int(10) category_id 列的新Mantis表。

简化结构如下

bug_table (旧数据库)

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

category_table (新数据库)

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

我需要一个神奇的查询,它会将 bug_table 中的category_id替换为 category_table 中的数字category_id。值得庆幸的是,我可以按project_id匹配行,按name匹配类别。

这是我正在处理的查询,但已经陷入了复杂性

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

1 个答案:

答案 0 :(得分: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。

  6. =====

    请注意,如果您决定使用上面提到的替代列方法,那么查询当然会有类似但略有不同。然后最后只需要一个列丢弃

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