我在关系数据库中有一堆表,显然,由于外键关系,它们相互依赖。我想建立一个依赖树,遍历它,并输出 INSERT SQL 语句。我需要首先在我的依赖树中为外键表输出 SQL,因为父表将依赖于它们的外键标识符表中的值。
按后序遍历的二叉树是否适合这项任务?
我在关系数据库中有一堆表,显然,由于外键关系,它们相互依赖。我想建立一个依赖树,遍历它,并输出 INSERT SQL 语句。我需要首先在我的依赖树中为外键表输出 SQL,因为父表将依赖于它们的外键标识符表中的值。
按后序遍历的二叉树是否适合这项任务?
看看以下内容:
Microsoft.SqlServer.Management.Smo.Server
Microsoft.SqlServer.Management.Smo.Database
Microsoft.SqlServer.Management.Smo.Scripter
Microsoft.SqlServer.Management.Smo.DependencyTree
Microsoft.SqlServer.Management.Smo.DependencyWalker
Microsoft.SqlServer.Management.Smo.DependencyCollection
Microsoft.SqlServer.Management.Smo.DependencyCollectionNode
MSDN上有关于如何使用所有这些的示例。
本质上你想要类似的东西
Server server = new Server(SOURCESERVER);
Database database = server.Databases[SOURCEDATABASE];
Scripter sp = new Scripter(server);
...
UrnCollection col = new UrnCollection();
foreach (Table table in database.Tables)
{
col.Add(table.Urn);
}
....
DependencyTree tree = sp.DiscoverDependencies(col, DependencyType.Parents);
DependencyWalker walker = new DependencyWalker(server);
DependencyCollection depends = walker.WalkDependencies(tree);
//Iterate over each table in DB in dependent order...
foreach (DependencyCollectionNode dcn in depends)
...
如果一个表可以依赖于两个以上的表,那么二叉树将是不够的。让表 A 依赖于表 B、C 和 D。然后您必须先插入 B、C 和 D,即 A 在树中应该有三个子节点。
我认为您需要使用更通用的树结构,它允许任意数量的子节点。如您所建议的,以后序遍历此树结构应该会产生所需的结果。
当您的依赖图包含循环并且您需要推迟约束检查时,事情将开始变得混乱;)