postgresql 删除ID重复数据
发布时间:2020-12-13 17:09:51 所属栏目:百科 来源:网络整理
导读:原来表设计没有主键导致SQL重复执行时会产生多条一模一样的主键,现在需要对原来的表建立主键,需要对ID重复的数据进行删除,只保留一条虽然数据完全一致,但好在pgsql数据库提供了ctid的隐藏列,根据此列可以把只保留最小ctid的相同数据行。于是写了以下存储
原来表设计没有主键导致SQL重复执行时会产生多条一模一样的主键,现在需要对原来的表建立主键,需要对ID重复的数据进行删除,只保留一条虽然数据完全一致,但好在pgsql数据库提供了ctid的隐藏列,根据此列可以把只保留最小ctid的相同数据行。于是写了以下存储过程来处理。方便多了。再也不错这种问题了。
CREATE OR REPLACE FUNCTION delete_repeat(tablename varchar) RETURNS bigint AS $BODY$ DECLARE rec RECORD; sql varchar; BEGIN RAISE INFO '处理表名:%',tablename; IF NOT exists(select * from pg_class where relname = tablename) then RAISE INFO '处理表不存在:%',tablename; RETURN -1; END IF; FOR rec in EXECUTE('select id from '||tablename||' group by id having count(id) > 1') LOOP RAISE INFO 'id:%',rec.id; sql := 'delete from ' || tablename || ' where id = ''' || rec.id|| ''' and ctid <> (select min(ctid) from ' || tablename || ' where id = ''' || rec.id|| ''')'; execute sql; RAISE INFO 'sql:%',sql; END LOOP; RETURN 1; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; select delete_repeat('t_menu'); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- 使用PostgreSQL中的EXCLUDE防止相邻/重叠的条目
- 使用RPostgreSQL从R上远程连接到Heroku上的Postg
- 使用 IntraWeb (31) - IntraWeb 的 Xml 操作使用
- 为什么在WCF中忽略XmlRoot属性以及如何克服这个问
- cocos2d-x 3.x 引入【#include "cocos-ext.h
- ruby-on-rails – 来自测试台的RSpec模拟
- 如何访问内核模块中的任何内核符号?
- PostgreSQL: 浅谈 PostgreSQL 的 timestamp 类型
- 详解vue-cli 快速搭建单页应用之遇到的问题及解决
- data-binding – XML视图中CSS类属性的数据绑定
热点阅读