使用相同的模式将数据子集复制到空数据库

时间:2010-05-10 13:50:42

标签: sql-server

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

为了简化我的案例,就像这样:

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,但我还有其他表)。

2 个答案:

答案 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