我正在将具有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
答案 0 :(得分:0)
我喜欢以与新查找/引用表相同的方式处理此类任务。
对我来说,新类别表只有id和name列。根据示例数据,只有两行:服务器和数据库。是的,我意识到可能还有其他名称,但在继续最大化随后的id匹配之前,可以轻松添加这些名称,并且应该添加这些名称。
接下来,我将在bug表中添加一个新列,该列可以被称为“category_new”,其数据类型将存储新的类别ID。或者,您可以将现有的category_id列重命名为category,然后id的新列可以是column_id。
完成所有操作后,您可以通过加入名称类别来更新新列,并设置匹配的ID:(注意这假定非 - 步骤2)中提到的替代方法
UPDATE bug_table JOIN category_table ON bug_table.category_id = category_table.name
SET bug_table.category_new = category_table.id
运行后,检查新列以验证更新后的ID。
最后,在成功更新后,现在可以删除bugs_table中的旧category_id列(带有名称),并且可以将category_new列重命名为category_id。
=====
请注意,如果您决定使用上面提到的替代列方法,那么查询当然会有类似但略有不同。然后最后只需要一个列丢弃
如果有其他表格应用相同的类别更改,那么这些表格的操作(基本上是步骤2到5)也是类似的。