代码之家  ›  专栏  ›  技术社区  ›  vicatcu

复制关系表数据

  •  5
  • vicatcu  · 技术社区  · 15 年前

    我希望我在这个问题上不要太啰嗦,我只是想确保我的问题是完全清楚的(我认为这是相当混乱:)。

    我有一个数据库,里面有一堆表,上面设置了所有外键约束。关系有时是多个表的深度,也有子表与多个父表相关的情况。我想插入一个“顶级”表行的副本,以及与之相关的所有子表数据(保持关系完整性)。也就是说,我的新顶层行获得它自己的新主键(通过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

    1 回复  |  直到 8 年前
        1
  •  1
  •   oluies    15 年前

    我也做过类似的事情 INSERT INTO ... SELECT

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

    推荐文章