0

这与如何在mysql中更改ID有关

我还检查了其他问题,没有一个与这个问题非常相似。

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

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

假设我有 2 家企业。

他们有 2 个 ID。

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

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

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

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

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

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

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

4

1 回答 1

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
  • 创建并使用维护脚本清除合并从属服务器
于 2012-05-24T09:24:26.043 回答