微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgresql 删除ID重复数据

原来表设计没有主键导致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');

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐