怎么按依赖顺序列出表(基于外键)?
本教程将介绍如何按依赖顺序列出表(基于外键)?的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。
问题描述
这个问题最初是由@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
;
好了关于怎么按依赖顺序列出表(基于外键)?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。