导出和合并数据库时外键的标准方法或最佳做法

时间:2019-05-29 20:04:44

标签: mysql sql

合并两个带有外键表的数据库(具有相同架构)时,是否存在最佳实践?我正在寻找一种使用MySQL(或任何标准SQL语言功能)的方式来导出带有外键占位符的行,并在导入时将定义了外键的行插入正确的新分配值(通过自动递增)分配了一个。

我可以通过SQL之外的编程来做到这一点,但我好奇是否有更好的方法仅使用SQL或MySQL专用方法。

如果唯一的选择是编程,是否有推荐的方法(导出为JSON)?我的尝试奏效了,但效果并不理想,最终我自己编写了所有导入方法,这容易出错和出现错误。

1 个答案:

答案 0 :(得分:0)

我不知道任何本机方法,但是我在处理这种情况时的一般方法(如果我正确理解了您的问题-克隆具有2个表的数据,并通过外键加入第二个表,该数据会是第一个表上的标识列),如下所示:

注意:仅当第一个表(具有标识列作为外键的表,ALSO还具有一组唯一的列而不是标识列)时,此方法才有效。这称为“ {natural key”(hat / tip @rd_nielsen)。希望您已经在第一个表上以唯一索引的形式获得了一个唯一索引,而不是唯一键。

示例:表“ t1”具有列id1, c1, c2, c3, c4,表“ t2”具有id2, id1, d1, d2, d3,其中id1是t1中的标识列,而t2中是外键;而c1 + c2是t1中的自然键。

该技术依赖于构建一个临时过渡表,该表将第二个表中的外键替换为第一个表的自然键,而不是第一个表的标识列。

  1. 在作为自然键的第一个表中找到唯一的列组合(在此示例中为c1+c2

  2. 运行一个联接查询,该联接查询将第一个表的自然键的列与第二个表联接;通过外键;进入临时表。

    -- Sybase syntax.
    SELECT t1.c1, t1.c2, t2.d1, t2.d2, t2.d3
    INTO   tempdb..t2_lookupable
    WHERE  t1.id1 = t2.id1
    
    -- While at it, let's build the migratable columns (everything except identity) for t1
    SELECT t1.c1, t1.c2, t1.c3, t1.c4
    INTO   tempdb..t1_lookupable
    
  3. 根据需要将数据从tempdb..t1_lookupable和tempdb..t2_lookupable表复制到目标。

    这可能涉及在两个数据库中合并有价值的数据,或者需要执行的其他任何操作。可能是bcp out / in,也可能是其他方法-取决于您的工作。

  4. 从目标上的tempdb..t1_lookupable中的数据填充新的t1表

    -- Could be a BCP
    SELECT c1, c2, c3, c4   -- id1 will get autopopulated, being an identity column
    FROM   tempdb..t1_lookupable
    
  5. 现在,棘手的部分-通过将新的t1表和t2_lookupable表的组合加入c1和c2唯一键集上的这两个表来查找正确的新“ id1”值,从而填充新t2表:

    SELECT t1.id1, t2t.d1, t2t.d2, t2t.d3
    INTO   
    FROM   t1, tempdb..t2_lookupable t2t
    WHERE  t1.c1 = t2t.c1
     AND   t1.c1 = t2t.c2