【问题标题】:How to merge 2 Records in innoDB MySQL databases如何在innoDB MySQL数据库中合并2条记录
【发布时间】:2012-05-24 09:10:46
【问题描述】:

这与How to change ID in mysql有关

我也检查了其他问题,没有一个和这个很像。

众所周知,innodb 有一个特性。例如,如果我想更改记录的 id,那么所有其他指向前一个 ID 的表都会神奇地更新。

如果我想合并 2 条记录怎么办?

假设我有 2 家企业。

他们有 2 个 ID。

我想将它们合并为一个。我还想使用 innodb 很棒的功能来自动更改内容。

我不能只将其中一个 ID 更改为另一个 ID。或者我可以吗?

如何合并数据库中的 2 条相似记录?

当然,实际纳入合并记录的是业务决策。

基本上我只是不想一一指出所有其他表格。我认为更新规则是有原因的。有没有办法让我将slaveID更改为masterID,保持master中的所有数据相同,然后让数据库本身(而不是我的程序)重新指向所有指向slaveID的表指向masterID?当然,slaveID 的记录无论如何都会消失。

例如,使用普通的mysql引擎,你可以更改ID,然后你必须遍历所有指向旧ID的表来指向新ID。使用 innodb,重新指向是由数据库引擎本身完成的。这有点酷。为什么有人会使用非innodb引擎。

我也想这样做,但要合并。

【问题讨论】:

    标签: mysql database innodb


    【解决方案1】:

    尝试将记录主键设置为现有值只会导致键冲突错误。乍一看这很简单,但它有一个副作用:您不能使用ON UPDATE CASCADE 来合并两条记录 - 它根本不起作用。

    如果您有可能更改架构,则可以使用旧的但很好的重定向技巧:

    (假设您的 ID 是正数,可能是无符号整数)

    • 添加字段redirect int not null default 0
    • 创建视图:

    .

    CREATE VIEW tablename_view 
    SELECT 
      -- repeat next line for every field apart from redirect
      IF(s.redirect>0,m.<fieldname>,s.<fieldname>
    FROM tablename AS s
    LEFT JOIN tablename AS m ON s.redirect=m.id
    
    • 当您将一条记录(从)合并到另一条记录(主)中时,请运行 UPDATE tablename SET redirect=&lt;id_of_master&gt; WHERE id=&lt;id_of_slave&gt;
    • 调整您的选择查询以选择 tablename_view 而不是 tablename
    • 创建并使用维护脚本清除合并从属节点

    【讨论】:

    • 所以基本上我们必须遍历所有指向从属的表并将它们重新指向主控?
    • 如果“主”记录有redirect=&lt;id_of_self&gt;,则视图不需要任何IF 表达式,而可以简单地使用SELECT m.* FROM ...
    • 在维护脚本中,这就是你要做的。优点是,after 重定向,但 before 维护您拥有这两条记录,但只有一条被积极使用,因此您有一个完美的机会进行业务合并规则
    • 其实这不是问题。假设我不需要机会之窗。我只是不想一一指出所有其他表格。我认为更新规则是有原因的。有没有办法让我将slaveID更改为masterID,保持master中的所有数据相同,然后让数据库本身(而不是我的程序)重新指向所有指向slaveID的表指向masterID?当然,slaveID 的记录无论如何都会消失。
    • @eggyal 你是对的,但通常选择零是为了安全和易于插入:当你使用 AUTO_INCREMENT 插入时,你需要一个 AFTER INSERT 触发器来填充重定向,如果你更新一个 ID,正如 OQ 似乎暗示的那样,你如履薄冰:很容易忘记更新自我重定向。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 2015-08-22
    • 2017-05-13
    • 2023-04-02
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    相关资源
    最近更新 更多