我希望我在这个问题上不要太啰嗦,我只是想确保我的问题是完全清楚的(我认为这是相当混乱:)。
我有一个数据库,里面有一堆表,上面设置了所有外键约束。关系有时是多个表的深度,也有子表与多个父表相关的情况。我想插入一个“顶级”表行的副本,以及与之相关的所有子表数据(保持关系完整性)。也就是说,我的新顶层行获得它自己的新主键(通过auto\u increment),所有新的子行获得它们自己的主键(同样通过auto\u increment),并且表的所有外键信息与我复制的数据类似地相关(仅现在使用新创建的主键)。所以现在我有了一个关系数据的副本,它可以独立于原始数据进行修改。
为了使我的例子更具体,我煞费苦心地建立了一个类似的,但更简单的例子。让我们定义下表:
alt text http://www.freeimagehosting.net/uploads/ef22070a89.png
所有绿色的id字段都是自动更新主键,而黄色的是带有外键约束的索引列。假设数据库最初包含以下数据:
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 |
+----+-------------+---------------+------------+-------------+
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。我期待着听到一些关于你如何用“正确的方式”做这样的事情的好主意
我已经发布了
a MySQLDump of the example
编辑
不管它值多少钱,我发布了一个更简单/更广泛的问题
here