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

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

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

最佳答案

我不知道任何本机方法,但是在处理此类情况时是我的一般方法(如果我正确理解了您的问题-克隆具有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中的自然键。

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


在第一个表中找到唯一的列组合(在此示例中为c1+c2),这是自然键。
运行联接查询,该联接查询将第一个表的自然键的列与第二个表联接;通过外键;进入临时表。

-- 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

根据需要将数据从tempdb..t1_lookupable和tempdb..t2_lookupable表复制到目标。

这可能涉及在两个数据库之间进行有价值的数据合并,或者需要执行的其他任何操作。可能是bcp out / in,也可能是其他方法-取决于您的工作。
从目标上的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

现在,棘手的部分-通过在c1和c2唯一键集上连接这两个表,找到正确的新“ id1”值,从新t1表和t2_lookupable表的组合中填充新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

08-25 12:19
查看更多