postgresql 使用sql查询所有未指定主键的表
·
👨⚕️ 主页: gis分享者
👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅!
👨⚕️ 收录于专栏:数据库工程师
一、👣前言
根据数据库设计规范,库表创建时需要设置主键,因为主键可以保证数据的唯一性、确保数据的完整性、提升数据库性能、方便数据管理、以及便于建立数据模型。
1.1👣 库表建立主键的优点
1、保证数据唯一性,一个主键值对应一条记录
主键的存在,避免了表中出现重复的数据行,如果没有主键,那么当我们需要查找或操作某一特定记录时,可能会因为数据重复而无法准确进行。
2、保证数据的完整性
设置主键,使得数据库能无法插入重复的数据行或是空的数据行。保证数据的完整性
3、方便数据管理
使用主键,可以更方便地对数据进行插入、修改和删除操作。而且,如果表中的数据需要进行整理或者迁移,主键也可以作为数据迁移的依据。
主键有这么多优点,但是当我们创建很多库表或者进行库表迁移时,很可能造成一些库表主键的缺失,下面通过sql语句可以查询pg库哪些库表没有指定主键,方便我们查缺补漏。
二、👣查询所有未指定主键的表
通过下面sql语句我们可以查询到未指定主键的库表
```yaml
SELECT T
.schemaname,
T.tablename,
T.tableowner,
T.TABLESPACE,
CASE
C.relkind
WHEN 'r' THEN
'table'
WHEN 'v' THEN
'view'
WHEN 'm' THEN
'materialized view'
WHEN 'i' THEN
'index'
WHEN 'S' THEN
'sequence'
WHEN 's' THEN
'special'
WHEN 'f' THEN
'foreign table'
WHEN 'p' THEN
'partitioned table'
WHEN 'I' THEN
'partitioned index'
END AS "Type"
FROM
pg_class C,
PG_TABLES T
WHERE
T.tablename = C.relname
AND T.schemaname NOT IN ( 'pg_catalog', 'information_schema' )
AND T.tablename NOT IN (
SELECT
pg_class.relname TABLENAME
FROM
pg_constraint
INNER JOIN pg_class ON pg_constraint.conrelid = pg_class.oid
WHERE
pg_constraint.contype = 'p'
AND relnamespace IN ( SELECT oid FROM pg_namespace WHERE nspname = 'public' )
)
效果如下:

三、👣总结
以上为postgresql 使用sql查询所有未指定主键的表的方法,希望对您有帮助~
更多推荐


所有评论(0)