前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >知识分享之PostgreSQL——快速清除表中的数据

知识分享之PostgreSQL——快速清除表中的数据

作者头像
cn華少
发布2021-12-15 09:20:33
1.6K0
发布2021-12-15 09:20:33
举报
文章被收录于专栏:IT综合技术分享

知识分享之PostgreSQL——快速清除表中的数据

背景

日常我们开发时,我们会遇到各种各样的奇奇怪怪的问题(踩坑o(╯□╰)o),这个常见问题系列就是我日常遇到的一些问题的记录文章系列,这里整理汇总后分享给大家,让其还在深坑中的小伙伴有绳索能爬出来。 同时在这里也欢迎大家把自己遇到的问题留言或私信给我,我看看其能否给大家解决。

开发环境

  • 系统:windows10
  • 版本:PostgreSQL 13

内容

我们想要对于全库中的所有表进行清除数据操作,这时我们需要用到truncate table [表名] 相关语句,清除单张表这样是可以的,但当我们有很多很多的表时怎么办呢,这时我们就需要使用到存储过程了

1、首先我们创建一个自定义类型,用于存储表名和数据的行数

代码语言:javascript
复制
CREATE TYPE table_count AS (table_name TEXT, num_rows INTEGER); 

2、进行创建一个存储过程

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION count_em_all (limitNum INTEGER) RETURNS SETOF table_count  AS '
DECLARE 
    the_count RECORD;   -- 当前行数
    t_name RECORD;   -- 当前表名
    r table_count%ROWTYPE;
BEGIN
-- 循环所有表,对于每个表进行相关操作。
    FOR t_name IN 
        
                select concat_ws(''.'',''"''||pn.nspname||''"'',''"''||pc.relname||''"'') as relname from pg_class as pc
                LEFT JOIN pg_namespace as pn ON pn.oid = pc.relnamespace
                where pc.relkind = ''r'' and pn.nspname !=''pg_catalog''
        LOOP
            -- 对当前循环到的表名进行统计行数,这里我们使用的count,实际上如果要高效建议使用数据库中的大概统计,而不是这个。
            FOR the_count IN EXECUTE ''SELECT COUNT(*) AS "count" FROM '' || t_name.relname 
            LOOP 
            END LOOP; 
            -- 存储表名
            r.table_name := t_name.relname; 
            -- 存储行数
            r.num_rows := the_count.count; 
                                            -- 如果当前我们传入的是一个大于0的,则认为需要执行清除操作。
                        IF limitNum>0 THEN
                                                        -- 开始进行清除大于限定数量的表数据。
                            IF r.num_rows>limitNum THEN
                                LOOP
                                 EXECUTE ''truncate table '' || r.table_name;
                                END LOOP; 
                            END IF;
                        END IF;
            RETURN NEXT r; 
        END LOOP; 
        RETURN; 
END;
' LANGUAGE plpgsql; 

3、进行执行存储过程

代码语言:javascript
复制
-- 清除所有超过1w条数据的表数据。
SELECT * FROM count_em_all(10000) AS r ORDER BY r.num_rows DESC;

这样我们就可以有效的清除超过限定数量的表数据了,不过当前存在一定的性能问题,后续再进行补充高效的存储过程。

参见文章: https://www.cnblogs.com/tommy-huang/p/9365907.html https://www.coderbusy.com/archives/1842.html

本作品由 cn華少 采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/12/13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 知识分享之PostgreSQL——快速清除表中的数据
    • 背景
      • 开发环境
        • 内容
          • 1、首先我们创建一个自定义类型,用于存储表名和数据的行数
          • 2、进行创建一个存储过程
          • 3、进行执行存储过程
      相关产品与服务
      对象存储
      对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档