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

标签 mysql sql

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

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

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

最佳答案

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

注意:这仅在第一个表(具有用作外键的标识列的表,也具有一组不是标识列的唯一列)时才有效。这称为“natural key”(帽子/提示@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 表的组合来填充新 t2 表,方法是通过在 c1、c2 唯一键集上连接这 2 个表来查找正确的新“id1”值:

    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
    

关于mysql - 导出和合并数据库时外键的标准方法或最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56367753/

相关文章:

php - 如何使用PHP查询MySQL数据库并显示其搜索结果?

mysql - MySQL 中的 "Invalid use of group function"

php - 如何使用 PHP 将我的 URL 转换为两个可变部分?

MySql 查询选择最高的学生分数,包括必须学科分数

php - 在 php 中获取小时之间的数据

php - 与更新表中数量相关的错误

mysql - Solr 添加过滤查询

python - SQLalchemy:更改未提交到数据库

sql - MYSQL:没有公共(public)值的两个表 SELECT

mysql - 将列值拆分为多个列值(生成学生出勤报告)