Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 获取将被级联截断的表的列表_Postgresql_Cascade - Fatal编程技术网

Postgresql 获取将被级联截断的表的列表

Postgresql 获取将被级联截断的表的列表,postgresql,cascade,Postgresql,Cascade,有没有一种方法可以获得在postgres中也会被TRUNCATE CASCADE截断的表列表 例如,假设我们有三个表: a b (depends on a) c (depends on b) 截断级联还将截断b和c。我们怎么能提前检查呢 在answer的帮助下,您可以通过此查询获取外部表名 SELECT tc.constraint_name ,tc.table_name ,kcu.column_name ,ccu.table_name AS foreign_

有没有一种方法可以获得在postgres中也会被
TRUNCATE CASCADE
截断的表列表

例如,假设我们有三个表:

a
b (depends on a)
c (depends on b)
截断级联
还将截断
b
c
。我们怎么能提前检查呢

在answer的帮助下,您可以通过此查询获取外部表名

SELECT tc.constraint_name
      ,tc.table_name
      ,kcu.column_name
      ,ccu.table_name AS foreign_table_name
      ,ccu.column_name AS foreign_column_name 
FROM 
    information_schema.table_constraints AS tc 
    JOIN information_schema.key_column_usage AS kcu
      ON tc.constraint_name = kcu.constraint_name
    JOIN information_schema.constraint_column_usage AS ccu
      ON ccu.constraint_name = tc.constraint_name
WHERE constraint_type = 'FOREIGN KEY' AND ccu.table_name = 'a'

使用另一个查询创建视图

CREATE VIEW vdepend_table
AS
SELECT s1.constraint_name
    ,s1.table_name
    ,s1.column_name
    ,s1.ordinal_position
    ,s2.table_name_ref
    ,s2.column_name_ref
    ,s2.ordinal_position_ref
FROM (
    SELECT key_column_usage.constraint_name
        ,key_column_usage.table_name
        ,key_column_usage.column_name
        ,columns.ordinal_position
    FROM information_schema.key_column_usage
    JOIN information_schema.columns USING (
            table_name
            ,column_name
            )
    ) s1
JOIN (
    SELECT constraint_column_usage.constraint_name
        ,constraint_column_usage.table_name AS table_name_ref
        ,constraint_column_usage.column_name AS column_name_ref
        ,cols_ref.ordinal_position AS ordinal_position_ref
    FROM information_schema.constraint_column_usage
    JOIN information_schema.columns cols_ref ON cols_ref.table_name::TEXT = constraint_column_usage.table_name::TEXT
        AND cols_ref.column_name::TEXT = constraint_column_usage.column_name::TEXT
    ) s2 ON s1.constraint_name::TEXT = s2.constraint_name::TEXT
    AND NOT s1.table_name::TEXT = s2.table_name_ref::TEXT;
用法:

 select table_name from vdepend_table where table_name_ref='a'

试试看,你的工作很有魅力!我只想为那些搜索添加,您可以添加
和ccu.table_name='a'
,以满足这个问题。是的,您当然可以。