复制关系表数据

时间:2010-07-14 18:37:40

标签: mysql database performance grails relational-database

我希望我在这个问题上没有太长时间的啰嗦,我只是想确保我所要求的是完全明确的(我认为这很令人困惑:)。

我有一个包含大量表的数据库,并设置了所有外键约束。关系有时会有几个表深,并且还存在子表与多个父表相关的情况。我想插入一个我的“顶级”表行的副本,以及与之相关的所有子表数据(保持关系完整性)。也就是说我的新顶级行获得了自己的新主键(通过auto_increment),并且所有新的子行都获得了自己的主键(同样通过auto_increment),并且表的所有外键信息都类似于我复制的数据(现在只有新创建的主键)。所以现在我将获得一份与原始文件独立可变的关系数据的副本。

为了使我的榜样更加具体,我煞费苦心地建立了一个类似但更简单的例子。让我们定义以下表格:

alt text http://www.freeimagehosting.net/uploads/ef22070a89.png

所有绿色id字段都是auto_update主键,而淡黄色字段是带有外键约束的索引列。假设数据库最初包含以下数据:

job_types
+----+----------+
| id | jobcode  |
+----+----------+
|  1 | DEADBEEF |
|  3 | FEEDFACE |
+----+----------+

managers
+----+---------------+-------------+
| id | name          | job_type_id |
+----+---------------+-------------+
|  1 | John          |           1 |
|  3 | Michael Scott |           3 |
+----+---------------+-------------+

departments
+----+------+------------+
| id | name | manager_id |
+----+------+------------+
|  1 | H32  |          1 |
|  2 | X11  |          3 |
+----+------+------------+

employees
+----+-------------+---------------+------------+-------------+
| id | name        | department_id | manager_id | job_type_id |
+----+-------------+---------------+------------+-------------+
|  1 | Billy Bob   |             1 |          1 |           1 |
|  2 | Sandra Lee  |             1 |          1 |           3 |
|  3 | Buddy Holly |             2 |          3 |           1 |
+----+-------------+---------------+------------+-------------+

现在说我要做的是制作部门H32的关系副本(id = 1)。

我最终应该得到的结果如下(显然主键的实际值并不重要,参照完整性也是如此)。

job_types
+----+----------+
| id | jobcode  |
+----+----------+
|  1 | DEADBEEF |
|  3 | FEEDFACE |
|  4 | DEADBEEF |
|  5 | FEEDFACE |
+----+----------+

managers
+----+---------------+-------------+
| id | name          | job_type_id |
+----+---------------+-------------+
|  1 | John          |           1 |
|  3 | Michael Scott |           3 |
|  4 | John          |           4 |
+----+---------------+-------------+

departments
+----+------+------------+
| id | name | manager_id |
+----+------+------------+
|  1 | H32  |          1 |
|  2 | X11  |          3 |
|  3 | H32  |          4 |
+----+------+------------+

employees
+----+-------------+---------------+------------+-------------+
| id | name        | department_id | manager_id | job_type_id |
+----+-------------+---------------+------------+-------------+
|  1 | Billy Bob   |             1 |          1 |           1 |
|  2 | Sandra Lee  |             1 |          1 |           3 |
|  3 | Buddy Holly |             2 |          3 |           1 |
|  4 | Billy Bob   |             3 |          4 |           4 |
|  5 | Sandra Lee  |             3 |          4 |           5 |
+----+-------------+---------------+------------+-------------+

实现此类复制操作的效率最高的方法是什么?在Grails的上下文中,使用InnoDB表引擎,我正在使用MySQL。我期待听到一些关于你如何以“正确的方式”做这样的事情的好主意。

- 问候,维克

我在PasteBin上发布了a MySQLDump of the example初始化。

修改 为了它的价值,我发布了一个更简单/更广泛的问题here,我得到了普遍积极的回应,暗示我不是“只是做错了”......

1 个答案:

答案 0 :(得分:1)

我使用INSERT INTO ... SELECT语法做了类似的事情。 (C api还有一个MYSQL_OPTION_MULTI_STATEMENTS_ON,您可以使用它来运行多个语句。或者您可以使用一个过程)。

这是最有效的,因为您不必在客户端和服务器之间移动数据。复制的值是用于创建新实体的模板。我不明白你为什么要用这个特殊的数据模型来做这件事。