我希望我在这个问题上不会太啰嗦,我只是想确保我所问的内容完全清楚(我认为这相当令人困惑:)。
我有一个数据库,其中有一堆表,并且设置了所有外键约束。关系有时会深达几张表,并且也存在子级与多个父表相关的情况。我想插入“顶级”表行之一的副本以及与其相关的所有子表数据(保持关系完整性)。也就是说,我的新顶级行获得了自己的新主键(通过 auto_increment),并且所有新的子行都获得了自己的主键(再次通过 auto_increment),并且表的所有外键信息类似于我复制的数据(现在仅使用新创建的主键)。所以现在我将拥有一个独立于原始数据可变的关系数据的副本。
为了使我的示例更加具体,我煞费苦心地设置了一个类似但更简单的示例。让我们定义下表:
替代文本 http://www.freeimagehosting.net/uploads/ef22070a89.png 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 的上下文中使用 MySQL,使用 InnoDB 表引擎。我期待听到一些关于如何“以正确的方式”做这样的事情的好主意。
——问候,维克
我已经发帖了示例的 MySQLDump http://pastebin.com/v0RG0AJVPasteBin 上的初始化。
EDIT对于它的价值,我发布了一个更简单/更广泛的问题here https://stackoverflow.com/questions/3260091/databases-and-deep-copy/3260254#3260254我得到了普遍积极的回应,这表明我并没有“只是做错了”......