如何按照表的依赖关系顺序(基于外键)列出表?[英] How to list tables in their dependency order (based on foreign keys)?

本文是小编为大家收集整理的关于如何按照表的依赖关系顺序(基于外键)列出表?的处理方法,想解了如何按照表的依赖关系顺序(基于外键)列出表?的问题怎么解决?如何按照表的依赖关系顺序(基于外键)列出表?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

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

<小时>

背景

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

要求

根据依赖关系在数据库中生成一个表列表.
没有依赖关系(没有外键)的表将是第一个.
仅在第一组表中具有依赖关系的表将排在第二位.
仅在第 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 
            (
                select      1
                           ,object_id
                           ,name

                from        sys.tables

                where       type_desc       = 'USER_TABLE'
                        and is_ms_shipped   = 0

                union all

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

                            join        sys.tables  as t

                            on          exists
                                        (
                                            select      null

                                            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
            )


select      name
           ,max (lvl)   as dependency_level

from        cte

group by    name

order by    dependency_level
           ,name
;

本文地址:https://www.itbaoku.cn/post/1793967.html