2012-11-27 45 views
3

我完全知道这绝不应该发生。永远。但是,最近我开始在一家没有最好的数据库设计或输入验证的公司工作,这种情况已经出现。合并具有唯一列的两个表项(MySQL)

有一张表,我们称之为'工作'*。工作有一个主键,'ID'。 ID为1的作业具有与其相关的大量数据;然而,愚蠢的是,有人把这个工作重复为id 2(到目前为止,这发生了大约500次)。所有这两个信息都需要合并为id 1(或2,没关系)。

通过外键将列链接到UPDATE:CASCADE和DELETE:RESTRICT。他们并不都是所谓的jobs_id。

这里是我唯一的(貌似合理的)选项:

  1. 的变化ID 1的东西我可以保证不使用(2,147,483,647)
  2. 暂时移除外键删除:限制
  3. 删除ID为1
  4. 更新ID 2项至2,147,483,647
  5. 的变化ID 2,147,483,647(它与所有其他条目链接)ID 2
  6. 恢复删除:限制

由于没有代码的实际执行删除操作(限制在那里,就像一个故障安全(有人在DB)直接编辑),并且更新:级联留在,数据不应该不同步。虽然这看起来很乱。

这将被包裹在一个事务中。

我可以写一些东西来遍历每个表(〜180)和每列以找到某些名称/条件,然后从1更新到2,但是当新的表/列出现时需要维护。由于这种情况已经发生了很多,而且我没有看到重写以防止它很快发生,所以'解决方案'(贴膏药)需要是半自动的。

  • 不是表的真名。他(或她)的身份已被伪装,所以他(或她)不会受到欺凌。

欣赏任何输入。

+0

在我尝试回答此问题之前,请将以下各项添加到步骤中。 1.做一个完整的备份。 2.在另一台机器上测试备份,例如恢复到开发环境。 – Namphibian

+0

在生产服务器上执行之前,这总是要在开发环境中进行测试。 – Aeisor

回答

0

假设您知道如何识别重复的记录,为什么不创建具有相同结构(可能没有FK)的新表,然后在将值复制到新表时循环遍历原始表。当你点击一个副本时,在写入新表格时修改该值。然后放下原件并将温度重命名为原件。

这将清理表格,但如果进程仍在复制条目,则可以使用唯一键来限制未来的损害。