• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Postgresql 查询表引用或被引用的外键操作

    今天更新两个SQL。是用来查询PG中,主表被子表引用的外键,或子表引用了哪个主表的主键。

    废话不多说,直接上实验!

    CentOS 7 + PG 10

    创建两个实验表,test01为主表,test02为子表,test02引用test01中的id列。

    test=# create table test01(
    test(# id int primary key,
    test(# col1 varchar(20)
    test(# );
    CREATE TABLE
     
    test=# create table test02(
    test(# id int primary key,
    test(# test01_id int references test01(id),
    test(# col1 varchar(20)
    test(# );
    CREATE TABLE

    插入数据

    test=# insert into test01 values (1, 'a');
    INSERT 0 1
    test=# insert into test01 values (2, 'b');
    INSERT 0 1
    test=# insert into test01 values (3, 'c');
    INSERT 0 1
    test=# insert into test02 values (1, 1, 'a');
    INSERT 0 1
    test=# insert into test02 values (2, 1, 'a');
    INSERT 0 1
    test=# insert into test02 values (3, 1, 'a');
    INSERT 0 1
    test=# insert into test02 values (4, 2, 'b');
    INSERT 0 1
    test=# insert into test02 values (5, 2, 'b');
    INSERT 0 1
    test=# insert into test02 values (6, 11, 'b');
    ERROR: insert or update on table "test02" violates foreign key constraint "test02_test01_id_fkey"
    DETAIL: Key (test01_id)=(11) is not present in table "test01".

    查询主表被哪个子表引用。如果结果为空,说明没有任何子表引用的该表。

    test=# SELECT
    tc.constraint_name,
    tc.table_name, # 子表
    kcu.column_name,
    ccu.table_name AS foreign_table_name, # 主表
    ccu.column_name AS foreign_column_name,
    tc.is_deferrable,
    tc.initially_deferred
    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='test01'; # 输入主表
    constraint_name | table_name | column_name | foreign_table_name | foreign_column_name | is_deferrable | initially_deferred
    -----------------------+------------+-------------+--------------------+---------------------+---------------+--------------------
    test02_test01_id_fkey | test02 | test01_id | test01 | id | NO | NO
    (1 row)

    查询子表引用的哪个主表。如果结果为空,说明没有任何引用主表。

    test=# SELECT
    tc.constraint_name,
    tc.table_name, # 子表
    kcu.column_name,
    ccu.table_name AS foreign_table_name,
    ccu.column_name AS foreign_column_name, # 主表
    tc.is_deferrable,
    tc.initially_deferred
    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 tc.table_name='test02'; # 输入子表
    constraint_name | table_name | column_name | foreign_table_name | foreign_column_name | is_deferrable | initially_deferred
    -----------------------+------------+-------------+--------------------+---------------------+---------------+--------------------
    test02_test01_id_fkey | test02 | test01_id | test01 | id | NO | NO
    (1 row)

    补充:PostgreSQL 外键引用查询

    根据一个表名,查询所有外键引用它的表,以及那些外键的列名

    key_column_usage(系统列信息表),

    pg_constraint(系统所有约束表)

    SELECT x.table_name,
        x.column_name
     FROM information_schema.key_column_usage x
     INNER JOIN (SELECT t.relname, 
                a.conname 
             FROM pg_constraint a 
             INNER JOIN pg_class ft
                 ON ft.oid = a.confrelid 
             INNER JOIN pg_class t 
                 ON t.oid = a.conrelid
            WHERE a.contype = 'f' 
             AND a.confrelid =
                (select e.oid 
                 from pg_class e
                 where e.relname = 'xxx_table')
            ) tp 
         ON (x.table_name = tp.relname AND
           x.constraint_name = tp.conname)

    示例:

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

    您可能感兴趣的文章:
    • postgresql 索引之 hash的使用详解
    • PostgreSQL Sequence序列的使用详解
    • PostgreSQL之INDEX 索引详解
    • PostgreSql 重建索引的操作
    • PostgreSql 的hash_code函数的用法说明
    上一篇:PostgreSQL 删除check约束的实现
    下一篇:postgres 使用存储过程批量插入数据的操作
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Postgresql 查询表引用或被引用的外键操作 Postgresql,查询表,引用,或,