2009-06-15 190 views
2

我想運行以下SQL命令:更改表字段獨特

ALTER TABLE `my_table` ADD UNIQUE (
`ref_id` , 
`type` 
); 

的問題是,一些在表中的數據將使這個無效的,因此修改表失敗。

在MySQL中有刪除重複行的巧妙方法嗎?

+0

您正在使用哪些DBMS? SQL Server? – 2009-06-15 14:16:15

+0

...爲什麼你沒有在桌子上的主鍵開始? – Eric 2009-06-15 14:32:42

+0

@Eric - 這是一個獨特的複合鍵,而不是PK。 – GalacticCowboy 2009-06-15 15:11:37

回答

2

,如果你不關心哪個行被刪除,使用忽略:

ALTER IGNORE TABLE `my_table` ADD UNIQUE (
`ref_id` , 
`type` 
); 
4

SQL最多可以任意處理。換句話說:這是你的問題。

您有目前不是唯一的數據。你想讓它獨一無二。您需要決定如何處理重複項。

有多種處理方式這樣:

  • 修改或手工刪除重複的行數字是否足夠小;
  • 正在運行語句以更新或刪除滿足特定條件的重複以達到可以單獨處理例外情況的點;
  • 將數據複製到臨時表,清空原始數據並使用查詢重新填充表;和
  • 等。

注意:這些都需要用戶干預。

你當然可以將表複製到一個臨時表,清空原來的並複製到行中,只是忽略那些失敗,但我希望這不會給你你真正想要的結果。

-1

您將不得不尋找其他一些獨特的字段,因爲在ref_id和type上單獨刪除會全部刪除它們。

要得到重複:

select ref_id, type from my_table group by ref_id, type having count(*)>1 

Xarpb有一些巧妙的技巧(也許是太聰明):http://www.xaprb.com/blog/2007/02/06/how-to-delete-duplicate-rows-with-sql-part-2/

+1

你確定這個嗎?它看起來像它可能會刪除所有重複項(而不是離開1) – SpliFF 2009-06-15 14:30:32

0

你可以做的是增加一個臨時身份列到你的表。通過這種方式,您可以編寫查詢來識別和刪除重複項(您可以稍微修改查詢以確保只保留重複行集中的一個副本)。

完成此操作後,放棄臨時列並向您的原始列添加唯一約束。

希望這會有所幫助。

0

我過去所做的是導出唯一的數據集,刪除表,使用唯一列重新創建並導入數據。

它通常比試圖找出如何刪除重複數據更快。

0

有一篇很好的知識庫文章提供了查找和刪除具有重複值的行的分步方法。它提供了兩種方法 - 一種用於查找和刪除單行的一次性方法,以及涉及多行時解決此問題的更廣泛的解決方案。

http://support.microsoft.com/kb/139444

0

這裏是我以前在一個表中刪除重複行的片斷

BEGIN TRANSACTION 
Select *, 
rank() over (Partition by PolicyId, PlanSeqNum, BaseProductSeqNum, 
     CoInsrTypeCd, SupplierTypeSeqNum 
      order by CoInsrAmt desc) as MyRank 
into #tmpTable 
from PlanCoInsr 

select distinct PolicyId,PlanSeqNum,BaseProductSeqNum, 
     SupplierTypeSeqNum, CoInsrTypeCd, CoInsrAmt 
into #tmpTable2 
from #tmpTable where MyRank=1 

truncate table PlanCoInsr 

insert into PlanCoInsr 
    select * from #tmpTable2 

drop table #tmpTable 
drop table #tmpTable2 

COMMIT 
0

這對我有用:

ALTER TABLE table_name ADD UNIQUE KEY field_name (field_name)