怎么按依赖顺序列出表(基于外键)?

本教程将介绍如何按依赖顺序列出表(基于外键)?的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

怎么按依赖顺序列出表(基于外键)? 教程 第1张

问题描述

这个问题最初是由@PrateekGupta 提出的

@PrateekGupta 想对多个表执行批量插入操作.
表之间有外键关系.
如果在插入引用的表之前对具有外键的表执行 INSERT 操作,则操作可能会由于违反外键而失败.

根据它们的依赖关系在数据库中生成一个表列表.
没有依赖项(没有外键)的表将排在第一位.
仅在第 1 组表中具有依赖关系的表将排在第 2 位.
仅在第 1 组或第 2 组表中具有依赖关系的表将排在第 3 组.
等等……

推荐答案

 example:

 create table t1 (i int primary key,j int unique)
 create table t2 (i int primary key references t1 (i));
 create table t3 (i int,j int,primary key (i,j));
 create table t4 (i int,j int,  foreign key (i,j) references t3 (i,j));
 create table t5 (i int references t1 (i),j int,foreign key (i,j) references t3 (i,j));
 create table t6 (i int references t2 (i));

with  cte (lvl,object_id,name)
as 
(
 select1
,object_id
,name

 from  sys.tables

 where type_desc = 'USER_TABLE'
and is_ms_shipped= 0

 union all

 selectcte.lvl + 1
,t.object_id
,t.name
 from  cte

 join  sys.tables  as t

 on exists
 (
  selectnull

  from  sys.foreign_keys as fk

  where fk.parent_object_id  = t.object_id 
 and fk.referenced_object_id = cte.object_id
 )

and t.object_id <> cte.object_id
and cte.lvl < 30

 where t.type_desc  = 'USER_TABLE'
and t.is_ms_shipped = 0
)


selectname
  ,max (lvl)as dependency_level

from  cte

group by name

order by dependency_level
  ,name
;

好了关于怎么按依赖顺序列出表(基于外键)?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。