2

次のSQLコマンドを実行したい:

ALTER TABLE `my_table` ADD UNIQUE (
`ref_id` 、
タイプ
);

問題は、テーブル内の一部のデータがこれを無効にするため、テーブルの変更が失敗することです。

MySQL で重複行を削除する賢い方法はありますか?

4

8 に答える 8

4

SQL はせいぜいこれを任意に処理できます。別の言い方をすれば、これはあなたの問題です。

現在一意ではないデータがあります。あなたはそれをユニークにしたいです。重複の処理方法を決定する必要があります。

これを処理するには、さまざまな方法があります。

  • 数が十分に小さい場合、手動で重複する行を変更または削除します。
  • 特定の基準を満たす重複を更新または削除するステートメントを実行して、例外を個別に処理できるようにする。
  • データを一時テーブルにコピーし、元のテーブルを空にし、クエリを使用してテーブルを再作成します。と
  • すぐ。

注:これらはすべてユーザーの介入が必要です。

もちろん、テーブルを一時テーブルにコピーし、元のテーブルを空にして、失敗したものを無視して行にコピーすることもできますが、本当に必要な結果は得られないと思います。

于 2009-06-15T14:14:48.790 に答える
2

どの行が削除されるか気にしない場合は、IGNORE を使用します。

ALTER IGNORE TABLE `my_table` ADD UNIQUE (
`ref_id` ,
`type`
);
于 2009-06-15T14:48:10.147 に答える
0

私が過去に行ったことは、一意のデータセットをエクスポートし、テーブルを削除し、一意の列を使用してテーブルを再作成し、データをインポートすることです。

多くの場合、重複データを削除する方法を理解しようとするよりも高速です。

于 2009-06-15T14:19:23.727 に答える
0

重複する値を持つ行を見つけて削除するためのステップバイステップのアプローチを提供する優れたKB記事があります。これは、2つのアプローチを提供します。1つの行を見つけて削除するための1回限りのアプローチと、多くの行が関係する場合にこれを解決するためのより広範なソリューションです。

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

于 2009-06-15T14:24:49.610 に答える
0

これは私のために働いた:

ALTER TABLE table_name ADD UNIQUE KEY field_name (field_name)
于 2010-03-02T20:17:37.990 に答える
0

これは、テーブルの1つで重複する行を削除するために使用したスニペットです

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
于 2009-06-15T15:16:20.500 に答える
0

できることは、テーブルに一時的な ID 列を追加することです。これにより、重複を特定して削除するクエリを作成できます (クエリを少し変更して、重複行のセットから 1 つのコピーのみが保持されるようにすることができます)。

これが完了したら、一時的な列を削除し、元の列に一意の制約を追加します。

お役に立てれば。

于 2009-06-15T14:16:07.617 に答える
-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/

于 2009-06-15T14:15:53.343 に答える