复制并多次插入(mysql)?

Posted

技术标签:

【中文标题】复制并多次插入(mysql)?【英文标题】:Copy and mutiple insert into (mysql)? 【发布时间】:2012-10-17 21:59:53 【问题描述】:

我的问题很容易解释,但我找不到正确的答案!

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

提前致谢。

巴斯蒂安

【问题讨论】:

我真的想不出一个纯粹的 sql 方法来做到这一点,但可以很容易地用 php 或coldfusion 处理它。您是否使用任何类型的应用程序来访问您的数据库?如果是这样,什么语言,我会尽力帮助你。 我的应用基于 CodeIgniter (php)。我基本上使用 ActiveRecord,但有时对于复杂的请求,我直接使用原生 sql 查询。感谢您的帮助。 【参考方案1】:

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

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

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

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

【讨论】:

谢谢。这就是我在我的问题中找到并写下的解决方案。所以,我想我会保留它。似乎是唯一的一个。通过在 SO 上发布问题,我认为可能存在像 ON DELETE CASCADE 但用于插入的解决方案。好像没有!感谢您的帮助。【参考方案2】:

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

有意义吗?

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

【讨论】:

表格是一样的。只复制条目。我解释一下:最后,你在 tA 中是 A 和 A',在 tB 中是 B1'和 B2',在 tC 中是 C1、C2、C3、C1'、C2'、C3'。并且副本是临时命令。不需要保留 A' 是 A 的副本。因此,在每个表中添加仅用于复制的列在我看来有点硬编码。我会考虑的...不过谢谢你的回答 重点是在使用后面的表时,您需要某种方式来访问AA' 值。额外的列为您提供了这种能力。可能还有其他方法。祝你好运。 我不明白你所说的“后来的表格”是什么意思。没有第二组表。只有一组包含表格 tA、tB 和 tC。你能解释一下这一点吗? 要插入B'(比A'“晚”插入的表),您需要从AA' 中获取ID。 但是 B' 不是表格! B' 是一个条目,就像 A' 和 C'。条目是:A、B1、B2、C1、C2、C3 以及 A'、B1'、B2'、C1'、C2'、C3'。表只有 tA、tB 和 tC。所以条目 B1' 和 B2' 在表 tB 中。这就是为什么我不明白你在说什么以及我必须在哪里添加专栏。

以上是关于复制并多次插入(mysql)?的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL在codeigniter中多次插入[重复]

在codeigniter中多次进入mysql时获取最后插入的'Id'

Mysql从select多次插入

在MySQL多次插入中将数组值加入字符串

MySQL 性能:嵌套插入/重复键与多次更新

c#通过for循环多次向数据库中插入数据。