如何在innoDB MySQL数据库中合并2条记录

时间:2012-05-24 09:10:46

标签: mysql database innodb

这与How to change ID in mysql

有关

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

众所周知,innodb有一个功能。例如,如果我想调用记录的id,那么指向前一个ID的所有其他表将会神奇地更新。

如果我想合并2条记录呢?

说我有2个企业。

他们有2个身份证。

我想将它们合并为一个。我也想使用innodb awesome功能来自动更改内容。

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

如何在数据库中合并2个simmilar记录?

当然,合并记录的实际内容将是商业决策。

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

例如,使用普通的mysql引擎,您可以更改ID,然后您必须遍历所有指向旧ID的表以指向新ID。使用innodb,该重新创建由数据库引擎本身完成。哪个很酷。为什么有人会使用非innodb引擎。

我想做同样的事情但是要合并。

1 个答案:

答案 0 :(得分: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=<id_of_master> WHERE id=<id_of_slave>
  • 调整您的选择查询以从tablename_view而不是tablename
  • 中进行选择
  • 创建并使用维护脚本来清除合并从属