我想将数据库中充满数据的部分导出到空数据库中。两个数据库都具有相同的架构。我想保持参照完整性。
为了简化我的案例,就像这样:
MainTable有以下字段:
1)MainID整数PK
2)描述varchar(50)
3)ForeignKey整数FK到SecondaryTable的MainID
SecondaryTable具有以下字段:
4)MainID整数PK(由(3)引用)
5)AnotherDescription varchar(50)
我想要实现的目标是“使用WHERE条件从MainTable导出所有记录”,例如所有记录,其中MainID< 100。
要手动执行此操作,我首先要从此选择中包含的SecondaryTable中导出所有数据:
select * from SecondaryTable ST
outer join PrimaryTable PT
on ST.MainID=PT.MainID
然后从MainTable导出所需的记录:
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&lt; 100仅适用于MainTable,但我还有其他表)。
答案 0 :(得分:2)
听起来非常像Jailer工具,http://jailer.sourceforge.net/
答案 1 :(得分:1)
一种方法是简单地备份和恢复数据库。然后,您可以使用如下脚本轻松删除行:
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