加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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');

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读