pg数据库查找出所有未建立主键的表的超级简单方法,只需要使用到一张系统表

第一章 问题解决

step1 找出数据库中所有的表英文名称

找出数据库中所有的表英文名称,命名为表A

SELECT * from pg_class where pg_class.reltoastrelid!=0 and pg_class.relname not like 'pg_%' and pg_class.relname not like 'sql_%'

step2 找出所有主键的表

找出所有主键的表,命名为表B

SELECT pg_class.relname from pg_class where pg_class.relname like '%_pkey'

step3 查找出未建立主键的表

方式是:从A表中取出不在B表中去掉后缀‘_pkey’的元素,即可完成

SELECT A.a1 from (SELECT pg_class.relname a1 from pg_class where pg_class.reltoastrelid!=0 and pg_class.relname not like 'pg_%' and pg_class.relname not like 'sql_%' ) as A
where A.a1 not in  
(SELECT split_part(pg_class.relname,'_pkey',1) as aa from pg_class where pg_class.relname like '%_pkey')

第二章 知识补充

pg_constraint 该系统表存储PostgreSQL中表对象的检查约束、主键、唯一约束和外键约束。
pg_attribute该系统表存储所有表(包括系统表,如pg_class)的字段信息。数据库中的每个表的每个字段在pg_attribute表中都有一行记录。
pg_type该系统表存储有关数据类型的信息。
pg_class该系统表记录了数据表、索引(仍然需要参阅pg_index)、序列、视图、复合类型和一些特殊关系类型的元数据

pg_constraint.conname (约束名字)
pg_constraint.conrelid (该约束所在的表,如果不是表约束则为0)
pg_constraint.conkey (如果是表约束,则是约束控制的字段列表)
pg_constraint.contypec ( 检查约束, f = 外键约束, p = 主键约束, u = 唯一约束)
pg_constraint.conkey (如果是表约束(包含外键,但是不包含约束触发器),则是约束字段的列表)
pg_attribute.attname (字段名)
pg_attribute.attrelid (此字段所属的表)
pg_attribute.atttypid (字段的数据类型)
pg_attribute.attnum (字段数目。普通字段是从 1 开始计数的。系统字段 (比如oid)有(任意)负数)
pg_type.typname (数据类型名字)
pg_type.oid (行标识符(隐藏属性;必须明确选择))
pg_class.relname (数据类型名字)
pg_class.oid (行标识符(隐藏属性; 必须明确选择))

猜你喜欢

转载自blog.csdn.net/quantam/article/details/109308283