【问题标题】:Merging two databases with the same design (Mysql)合并具有相同设计的两个数据库(Mysql)
【发布时间】:2012-01-12 20:41:17
【问题描述】:

我有两个设计相同的数据库,在 Mysql 中有不同的记录 有两个具有唯一主键的主表。 (我的意思是如果不同数据库中的两条记录具有相同的主键,它们是相同的。)

这两个表与其他表有一些多对多的关系。但问题是小表 PK 在所有数据库中并不是唯一的(自动增量)

现在我想合并这两个数据库的数据。

有什么想法吗?

【问题讨论】:

  • 请附上您的代码/数据库结构,以便我们准确了解您目前所掌握的内容并更好地了解您想要做什么
  • 如果您使用自增作为主键,那么您对业务平等的假设是错误的。
  • 您是否要求主键保持不变?
  • @Tom:在所有数据库中都有一个主键唯一的大表,但也有一些小表与该表具有多对多关系,具有自动递增键!
  • @AssafKarmon:是的,我知道如何编写代码来解决这个问题,但我正在寻找一个查询!

标签: mysql sql


【解决方案1】:

编辑:我想我误读了您的说法,即密钥在数据库中是唯一的。在这种情况下,如果它已经在目标数据库中,我就不会从原始数据库中插入一行。您仍然可以使用相同的外键复制外键表。

基本上就是这样:

INSERT INTO MainTable (PK, field1, field2)
SELECT (PK, field1, field2)
FROM OldMainTable
WHERE PK NOT IN (SELECT PK FROM MainTable)

留下旧答案以防万一。

您最好的办法是修改表,使其具有 OldPrimaryKey 字段。然后,当您将数据插入目标数据库时,将原始 PK 存储在 OldPrimaryKey 字段中。然后,当您使用外键插入任何内容时,查找将 FK 匹配到 OldPrimaryKey 字段并更新外键以匹配。 (以防万一,创建外键副本可能是个好主意!)

所以查询可能看起来像这样:

INSERT INTO MainTableTarget  (OldPrimaryKey, field1, field2...)
SELECT PrimaryKey as OldPrimaryKey, field1, field2...
FROM OldMainTable

INSERT INTO Table2Target ( OldTable2PK, MainTableForeignKey, fielda, fieldb...)
SELECT Table2PK as OldTable2PK, 
        (SELECT PK FROM MainTableTarget) as MainTableForeignKey,  --This get the FK to point at the newly created database record
        fielda,
        fieldb
FROM OldTable2

这可能会很痛苦,但我认为这里没有任何不痛苦的选择......

哦,对不起,如果语法有点不对...我是一个 T-SQL 人,所以不太了解 MySQL 的语法。不过希望你能明白……

【讨论】:

    【解决方案2】:

    这个答案很大程度上取决于您的假设,即“如果不同数据库中的两条记录具有相同的主键,它们是相同的”。 假设您的数据是干净的,请将外键检查设置为 0。然后

    INSERT INTO db2.sometable
    
    SELECT * FROM db1.sometable on duplicate key ignore
    

    而不是插入忽略,它将忽略任何错误,而不仅仅是重复。对每个表执行此操作,然后将外键检查设置为 1。如果您想更加安全,可以对表运行拓扑排序并首先插入根表,同时保持外键检查处于活动状态。如果您有合成主键,则所有赌注都已关闭,您将需要重新分配键,这要困难得多。

    【讨论】:

    • 我想我比我更喜欢这个答案,因为你提到错误处理的原因。
    【解决方案3】:

    最简单的方法可能是对每个表使用这样的查询:

    INSERT IGNORE INTO db2.sometable
    SELECT * FROM db1.sometable
    

    只要确保以正确的顺序处理表,以免遇到外键问题(例如,先处理两个主表,然后是相关表)

    【讨论】:

    • 不可能不遇到外键问题。忽略错误不会让它神奇地消失......
    • 他说的顺序正确...如果对表依赖进行拓扑排序,您可以做到。
    • @Telos - 他已经说过两条具有相同PK的记录是相同的,所以使用INSERT IGNORE是合适的。
    • 好吧,我看错了那部分……但这仍然是错误的。考虑从 FK 表查询主表......你会得到两个应该有的结果。如果它们相同,那么最好不要从原始表中插入该行。
    • @Telos - 你不会得到重复的记录。 INSERT IGNORE 的语义基本是“尝试插入这条记录,但如果违反了唯一性约束,不插入也不报错”。
    猜你喜欢
    • 2013-03-24
    • 2013-09-06
    • 2010-10-14
    • 2014-03-30
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    相关资源
    最近更新 更多