1

我的问题很容易解释,但我没有成功找到正确的答案!

我在 mysql 中有 3 个表,分别称为 tA、tB、tC。我在 tA 中有一个条目 A,在 tB 中有 2 个条目 B,在 tC 中有 3 个条目 C,其层次结构如下:

            A
            |
     ----------------
     |              |
     B1             B2
     |              |
 --------           |
 |      |           |
 C1     C2          C3

可以想象,我有 B 条目链接到具有 A id 的 A 条目,而 C 条目链接到具有 B id 的 B 条目。

我只想将这些数据复制到:

            A'
            |
     ----------------
     |              |
     B1'            B2'
     |              |
 --------           |
 |      |           |
 C1'    C2'         C3'

所以一开始,我首先创建 A' 并复制链接到 A' 的 B 条目。不用担心。

但之后,我做了一个左连接请求,将 C 条目复制到 C'。它几乎可以工作......唯一的问题是,通过这种方式,我的 C' 条目链接到 B id 而不是 B' id !!!

我尝试了一些其他的东西,但我不知道该怎么做。看起来很简单。也许我累了……也许我要一个一个地复制B条目,然后将当前B条目的所有C条目复制到下一个。

但是没有更聪明的方法吗?使用 insert_id、级联、触发器、外键 ???

我不是 sql 专家,我希望这里有人会有一个很好的解决方案。

提前谢谢。

巴斯蒂安

4

2 回答 2

0

向您的第二组表中添加一列,该列将包含来自原始组的 ID。创建 A' 后,您可以使用原始 ID 创建 B' 条目。然后,使用来自 B' 的原始 ID 创建 C'。

有道理?

因此,通过@bastien 提供的更多信息,我建议在 tableA 中添加一个名为old_id. 插入复制的行时,将原始行id放入old_id. 然后,您可以使用old_id在 tableB、tableC 等中查找相关行。

于 2012-10-18T01:58:11.013 回答
0

Alain 的方法是纯粹在 SQL 中处理此问题的一种可能方式,但需要对表进行一些修改,基本上存储了从中复制对象的原始 id。

所以你说你正在使用php,我希望我能给你更多相关的例子,但是我已经离开php太久了。但是您应该能够执行以下操作。

  1. 从数据库中获取 A,将 A id 存储在 php 中的变量中(建议 $oldAID)
  2. 复制 A 属性并作为 A' 存储回数据库
  3. 获取最后插入 ID 并存储为变量(建议 $newAID)
  4. 从其中 parent = $oldAID 的 DB 中获取所有 B 记录
  5. 循环遍历 b 条记录,将当前记录 id 存储为 $oldBID
  6. 复制 B1 属性并将其作为 B1' 存储回 DB,父 ID 为 $newAID
  7. 获取最后一个 insertID 并存储为 $newBID
  8. 从父 ID = $oldBID 的数据库中获取所有 C 记录
  9. 使用父 ID = $newBID 复制并存储回数据库
  10. 遍历您在步骤 5 中开始的循环

通过使用 PHP 来密切关注您的最后一个插入 ID,您可以制作所需的副本并保持它们的准确性。不利的一面是,php 和 MySQL 之间有很多来回,所以在一个非常大的集合中,这会深入几个层次,这样的过程可能需要几秒钟。但是,如果您的正常集合与您的示例一样小且浅,那应该不会太糟糕。

于 2012-10-18T16:38:15.387 回答