如何合并两个数据库,具有相同的数据,但具有不同的PK,没有重复的字段?

时间:2014-07-25 15:17:19

标签: mysql database ms-access

我有两个mdb文件。 如有必要,我也可以将其转换为MySQL数据库。

如何将这两个不同的dbs合并为一个?

这个想法是从dbs获取所有信息并合并为一个,而不复制任何客户端。 问题是两个bds都有相同的客户端和不同的客户端,但客户端的PK不一样。

每一行都有一个独特的领域,我想它可以以某种方式提供帮助。 知道我该怎么办?

4 个答案:

答案 0 :(得分:1)

选择UNION除PK之外的所有列只会为您提供不同的行:

insert into new_table (<non-pk columns>)
select <non-pk columns> from tableA
union
select <non-pk columns> from tableB

注意:union会删除重复项。

答案 1 :(得分:1)

我会运行一个UPDATE来填充其中一个表格,并提供所有可用的信息。

假设第一个表具有第二个表具有的所有名称(表2中没有不在表1中的名称值),您应该能够运行以下更新以使第一个表完成:

update tclient1 t join (select name,
                               max(tel) as tel_filled,
                               max(address) as add_filled
                          from (select name, tel, address
                                  from tclient1
                                union all
                                select name, tel, address
                                  from tclient2) x
                         group by name) x on t.name = x.name
   set t.tel = x.tel_filled and t.address = x.add_filled;

请参阅小提琴:http://sqlfiddle.com/#!2/3e7dc/1/0

答案 2 :(得分:0)

  1. 禁用外键(请参阅here
  2. 更新第二个数据库中的FK,使其唯一,例如:

    更新客户端   set id_client = id_client + 100000000;

    更新历史记录   设置id_client = id_client + 100000000,       id_history = id_history + 10000000;

  3. 启用FK以检查完整性

  4. 将第二个数据库导出为SQL插入并在第一个数据库中执行。

  5. 请使用备份。

答案 3 :(得分:0)

这是一种假设name是两行之间匹配的方法。它只计算填写的数字并选择适当的来源。此版本使用union allwhere使用>=<进行比较:

insert into client(id, name, tel, address)
   select id, name, tel, address
   from db1.client c1
   where ((id is not null) + (tel is not null) + (address is not null)) >=
          (select (id is not null) + (tel is not null) + (address is not null)
           from db2.client c2
           where c1.name = c2.name
          )
         )
    union all
    select id, name, tel, address
    from db2.client c2
    where ((id is not null) + (tel is not null) + (address is not null)) >
           (select (id is not null) + (tel is not null) + (address is not null)
            from db1.client c1
            where c2.name = c1.name
           )
          );

注意:上述版本假设name在两个表中(如您问题中的示例所示)并且没有重复项。如果不是这种情况,可以很容易地修改它。