首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >导出和合并数据库时外键的标准方法或最佳实践

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

Stack Overflow用户
提问于 2019-05-30 04:04:44
回答 1查看 37关注 0票数 0

当合并具有外键的表的两个数据库(具有相同的模式)时,有没有最佳实践?我正在寻找一种使用MySQL (或任何标准SQL语言特性)导出带有外键占位符的行并在导入时插入正确的新赋值的方法,一旦定义了外键的行(通过自动增量)已经赋值。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-30 04:26:37

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

注意:只有当第一个表(具有作为外键的identity列的表,也有一组唯一的不是identity列的列)才有效。这被称为"“(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语法。选择t1.c1、t1.c2、t2.d1、t2.d2、t2.d3到tempdb..t2_lookupable WHERE t1.id1 = t2.id1 --同时,让我们根据需要为t1构建可迁移的列(除了identity之外的所有列)选择t1.c1、t1.c2、t1.c3、t1.c4到tempdb..t1_lookupable

  • Clone中将数据从tempdb..t1_lookupable和tempdb..t2_lookupable表转移到目标。

这可能涉及到在两个数据库之间进行合并,这相当于data,或者需要完成的任何其他操作。可以是bcp out/ in,也可以是其他方法-取决于您执行的操作。

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

--可以是BCP SELECT c1,c2,c3,c4 -- id1将自动填充,成为来自tempdb..t1_lookupable

  • Now,的标识列。棘手的部分-从新的t1表和t2_lookupable表的组合中填充新的t2表,方法是通过在c2上连接这两个表来找到正确的新"id1“值,c2唯一键集:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56367753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档