代码之家  ›  专栏  ›  技术社区  ›  UnDiUdin

将数据子集复制到具有相同架构的空数据库中

  •  0
  • UnDiUdin  · 技术社区  · 14 年前

    我想将一个数据库的一部分数据导出到一个空数据库中。两个数据库具有相同的架构。我想保持参照完整性。

    为了简化我的案例,如下所示:

    Maintable有以下字段:
    1)mainid整数pk
    2)说明varchar(50)
    3)foreignkey整数fk到secondary表的mainid

    SecondaryTable具有以下字段:
    4)mainid integer pk(由(3)引用)
    5)其他说明varchar(50)

    我尝试实现的目标是“使用where条件从可维护的导出所有记录”,例如mainid<100的所有记录。

    要手动执行此操作,我将首先导出此选择中包含的第二个表中的所有数据:

    select * from SecondaryTable ST
    outer join PrimaryTable PT
     on ST.MainID=PT.MainID
    

    然后从可维护文件中导出所需的记录:

    select * from MainTable
    where MainID < 100.
    

    这是手动的,好的。当然,我的情况非常复杂,我有200多个表,所以手动操作是很痛苦/不可能的,我有许多级联FK。

    有没有办法只强制主表的副本“强制执行引用完整性”。

    所以我的问题是:

    select * from MainTable
    where MainID < 100
    WITH "COPYING ALL FK sources"
    

    在这种情况下,还将复制字段(5)。

    ==================================

    是否有语法或工具(也不是免费的,但它必须执行我需要的操作,而不仅仅是“db compare with no options”等功能的子集)来执行此操作?

    每个表我想插入条件(如mainid<100只用于可维护,但我还有其他表)。

    2 回复  |  直到 14 年前
        1
  •  1
  •   D'Arcy Rittich    14 年前

    一种方法是简单地备份和恢复数据库。然后,您可以使用如下脚本轻松删除行:

    delete from SecondaryTable1 where MainID < 100
    delete from SecondaryTable2 where MainID < 100
    ...
    

    假设您启用了级联删除,这对我来说似乎是最简单的。否则,您需要这样的东西:

    delete from Table1 where SecondaryTable1MainID < 100
    delete from SecondaryTable1 where MainID < 100
    delete from Table2 where SecondaryTable2MainID < 100
    delete from SecondaryTable2 where MainID < 100
    ...
    

    您可以像这样自动创建脚本:

    select 'delete from ' + TABLE_NAME + ' where MainID < 100' 
    from information_schema.tables
    
        2
  •  2
  •   George    14 年前

    听起来很像狱卒工具, http://jailer.sourceforge.net/