天天看點

postgresql 删除重複資料(完全一樣)僅保留一條

寫這篇文章的目的主要是緻力于提供一個開闊的思路,本文适應于有一定工作經驗且有SQL基礎的童靴。如果你想要照搬,Copy,那麼你可以跳過下面的内容了。

一 、問題描述

最近接手的老項目,在分析存儲過程時,發現pg資料庫中有一張配置表出現了完全相同 [所有字段都一樣] 的資料(根據group by分組得知)重複1次,其結果造成前端頁面展示時下拉框出現重複值。那麼,面臨的問題,很顯然就是如何删除多餘的1條資料?

二、解決方案

通常的思路:多餘1條,我把多餘的查出來,删了不就完事兒了,開始碼SQL。請注意:資料無價,備份資料。

首先group by,通過having count(*) > 1的,找到重複資料的id(本文中的這個場景,id值也重複),然後 DELETE FROM table WHERE id = ‘’ LIMIT 1;

執行上面的SQL,結果顯示error,文法錯誤。

經資料查詢,mysql支援delete後面加limit MySQL 5.7 Reference Manual,而pgsql 在update/delete後面均不支援limit。 怎麼搞?

1)思路1:先把資料取出來,通過臨時表來搞定

首先建立一張臨時表[temp],用于備份去重後的資料

insert into temp

select * from table where id not in ()

union

select … from table

group by … having count(*) > 1

然後删除原表中的資料,再把臨時表temp的資料倒騰回去。

2)思路2:資料不是太多,全删掉,再重新插入

你不是重複嗎,我沒法直接删除。那我就釜底抽薪,全給你删掉,然後再重新插入

首先根據group by having 得到重複id,select * from table where id IN (’’), 這裡我們可以借助Navicate工具導出SQL,目前pgAdminIII 暫未找到導出功能。然後整理去掉導出SQL中重複的資料。最後先删除原表中重複資料,再用去重後的SQL插入新資料。

三、小結

  • 君子性非異也,善假于物也。要善于利用工具
  • 多個方案,多條路。

四、參考資料

如果說我看得比别人更遠些,那是因為我站在巨人的肩膀上 ——牛頓

MySQL 5.7 Reference Manual