寫這篇文章的目的主要是緻力于提供一個開闊的思路,本文适應于有一定工作經驗且有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