PostgreSQL查询主键的详细信息、PostgreSQL查询没有主键的表名

PostgreSQL查询主键的详细信息

-- PostgreSQL查询主键的详细信息
SELECT pg_class.relname as table_name
      ,pg_constraint.conname AS pk_name
      ,pg_constraint.conkey as pk_column_number
      ,pg_constraint.conkey_old
      ,pg_attribute.attname AS colname
      ,pg_type.typname AS typename
  FROM (select unnest(conkey) as conkey
              ,p.conrelid ,p.contype ,p.conname
              ,p.conkey as conkey_old
          from pg_constraint p) pg_constraint
 INNER JOIN pg_class 
    ON pg_constraint.conrelid = pg_class.oid
 INNER JOIN pg_attribute 
    ON pg_attribute.attrelid = pg_class.oid
   AND pg_attribute.attnum = pg_constraint.conkey
 INNER JOIN pg_type 
    ON pg_type.oid = pg_attribute.atttypid
 WHERE 1=1
   AND pg_constraint.contype = 'p'
   and pg_class.relname ~ concat('^tzq_test_t'
                               ,'|^tzq_test_ti'
                               ,'|^tzq_sys_log_t'
                               ,'|^tzq_sys_user_t'
                               ,'|^tzq_permission_t')
 order by table_name
         ,pk_name
         ,pk_column_number
;

PostgreSQL查询没有主键的表名

-- PostgreSQL查询没有主键的表名
select * 
  from pg_class 
 where relname in (select tablename 
                     from pg_tables 
                    where schemaname = CURRENT_SCHEMA) 
   and relname not in (
      SELECT pg_class.relname as table_name
        FROM (select unnest(conkey) as conkey
                    ,p.conrelid ,p.contype ,p.conname
                    ,p.conkey as conkey_old
                from pg_constraint p) pg_constraint
       INNER JOIN pg_class 
          ON pg_constraint.conrelid = pg_class.oid
       INNER JOIN pg_attribute 
          ON pg_attribute.attrelid = pg_class.oid
         AND pg_attribute.attnum = pg_constraint.conkey
       INNER JOIN pg_type 
          ON pg_type.oid = pg_attribute.atttypid
       WHERE 1=1
         AND pg_constraint.contype = 'p'
       order by table_name
   )
   -- 最后四位非数字 (不是备份表)
   and not relname ~ '[0-9]{4}$'
;

你可能感兴趣的:(PostgreSQL,postgresql,数据库)