次のSQLコマンドを実行したい:
ALTER TABLE `my_table` ADD UNIQUE ( `ref_id` 、 タイプ );
問題は、テーブル内の一部のデータがこれを無効にするため、テーブルの変更が失敗することです。
MySQL で重複行を削除する賢い方法はありますか?
SQL はせいぜいこれを任意に処理できます。別の言い方をすれば、これはあなたの問題です。
現在一意ではないデータがあります。あなたはそれをユニークにしたいです。重複の処理方法を決定する必要があります。
これを処理するには、さまざまな方法があります。
注:これらはすべてユーザーの介入が必要です。
もちろん、テーブルを一時テーブルにコピーし、元のテーブルを空にして、失敗したものを無視して行にコピーすることもできますが、本当に必要な結果は得られないと思います。
どの行が削除されるか気にしない場合は、IGNORE を使用します。
ALTER IGNORE TABLE `my_table` ADD UNIQUE (
`ref_id` ,
`type`
);
私が過去に行ったことは、一意のデータセットをエクスポートし、テーブルを削除し、一意の列を使用してテーブルを再作成し、データをインポートすることです。
多くの場合、重複データを削除する方法を理解しようとするよりも高速です。
重複する値を持つ行を見つけて削除するためのステップバイステップのアプローチを提供する優れたKB記事があります。これは、2つのアプローチを提供します。1つの行を見つけて削除するための1回限りのアプローチと、多くの行が関係する場合にこれを解決するためのより広範なソリューションです。
これは私のために働いた:
ALTER TABLE table_name ADD UNIQUE KEY field_name (field_name)
これは、テーブルの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
できることは、テーブルに一時的な ID 列を追加することです。これにより、重複を特定して削除するクエリを作成できます (クエリを少し変更して、重複行のセットから 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/