mysql - 复制并多次插入(mysql)?

标签 mysql sql insert cascade lastinsertid

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

我在 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 专家,我希望这里有人能提供一个好的解决方案。

提前致谢。

巴斯蒂安

最佳答案

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

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

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

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

关于mysql - 复制并多次插入(mysql)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12944100/

相关文章:

php - 如何防止 PHP 中的 SQL 注入(inject)?

python - 如何使用 Python 在 MySQL 中将列表作为列插入?

python - 在 virtualenv 中运行测试时 Django MySQL 错误

SQL 2008 压缩

mysql - MySQL 中的日期时间数据类型出错

php - 带有 'now() + INTERVAL' 的 INSERT 语句在具有命名占位符的 PDO 中插入 000

python - 如何在 Python 中比较 Python float 和 Mysql 小数?

mysql - 计算子查询中的行

SQL Server 2008 - 将另一列的默认值绑定(bind)到主键

php - 使用 PDO 预准备语句插入时 MySQL 性能极差