合并两个带有外键表的数据库(具有相同架构)时,是否存在最佳实践?我正在寻找一种使用MySQL(或任何标准SQL语言功能)的方式来导出带有外键占位符的行,并在导入时将定义了外键的行插入正确的新分配值(通过自动递增)分配了一个。
我可以通过SQL之外的编程来做到这一点,但我好奇是否有更好的方法仅使用SQL或MySQL专用方法。
如果唯一的选择是编程,是否有推荐的方法(导出为JSON)?我的尝试奏效了,但效果并不理想,最终我自己编写了所有导入方法,这容易出错和出现错误。
答案 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中的自然键。
该技术依赖于构建一个临时过渡表,该表将第二个表中的外键替换为第一个表的自然键,而不是第一个表的标识列。
在作为自然键的第一个表中找到唯一的列组合(在此示例中为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
现在,棘手的部分-通过将新的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