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

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值