2012-04-16 8 views
0

MySQLテーブルからダブルレット(時にはトリプレット、残念ながら!)を削除しようとしています。私の問題は、利用可能な唯一のユニークなデータはプライマリキーなので、ダブルボックスを識別するためには、すべてのカラムを考慮する必要があります。ダブルテーブルの削除

私は二重引用符を持つすべてのレコードを識別し、二重引用符(一次キーを含む)と共にテーブルtempにコピーしました。ソーステーブルはtranslationと呼ばれ、TranslationIDという名前の整数の主キーを持っています。私はここからどのように進むのですか?ありがとう!

編集利用可能な列は以下のとおりです。

TranslationID 
LanguageID 
Translation 
Etymology 
Type 
Source 
Comments 
WordID 
Latest 
DateCreated 
AuthorID 
Gender 
Phonetic 
NamespaceID 
Index 
EnforcedOwner 

二枚舌の問題が1割り当てられLatest列と行を持つ存在します。

編集#2ありがとう、皆さんありがとうございました!私は次のクエリで、その結果、WouterHさんに答えを使用して問題を解決しました:

DELETE from translation USING translation, translation as translationTemp 
WHERE translation.Latest = 1 
AND (NOT translation.TranslationID = translationTemp.TranslationID) 
AND (translation.LanguageID = translationTemp.LanguageID) 
AND (translation.Translation = translationTemp.Translation) 
AND (translation.Etymology = translationTemp.Etymology) 
AND (translation.Type = translationTemp.Type) 
AND (translation.Source = translationTemp.Source) 
AND (translation.Comments = translationTemp.Comments) 
AND (translation.WordID = translationTemp.WordID) 
AND (translation.Latest = translationTemp.Latest) 
AND (translation.AuthorID = translationTemp.AuthorID) 
AND (translation.NamespaceID = translationTemp.NamespaceID) 
+0

元のテーブルに保存するレコードは気になりますか? –

+0

いいえ、私はどのレコードを保管してもかまいません。 – Leonard

答えて

4

重複を削除するには、一時テーブルまたはサブクエリを使用しないでください。同じデータを持っているすべての行ではなく、一意でない行を識別する異なるTranslationID

DELETE from translation USING translation, translation as translationTemp 
WHERE (NOT translation.TranslationID = translationTemp.TranslationID) 
AND (translation.LanguageID = translationTemp.LanguageID) 
AND (translation.Translation = translationTemp.Translation) 
AND (translation.Etymology = translationTemp.Etymology) 
AND // compare other fields here 
+0

これは私のためにやった!ありがとう! – Leonard

0

doublettes/triplettesは、プライマリキーを除いて同一である場合、あなたが同一である一時からすべてのレコードを選択することができます他のものより大きな主キーを持つことを除いて、これにより、各ダブレット/トリプレットの最小鍵付きのレコードが作成されます。これらのレコードを翻訳から削除することができます。

0

を削除し、私は新しいテーブルに有効なデータをコピーしようとした後、古いものを削除します新しいこの清潔な表と交換してください。私は2つの方法の

を見ることができます:あなたのSQLクエリ(source)でDISTINCTキーワードを使用して

  • すべての列についてGROUP BYステートメントを使用する(source)。
2

削除する必要があるIDの列を返すことができるように、現在のSELECTをサブ選択としてSELECTステートメントを作成します。 SELECTをDELETE FROM文に適用します。

例(擬似コード):

SELECT1 = SELECT ... AS temp; # the table you have right now 

SELECT2 = SELECT TranslationID FROM (SELECT1) 

最終クエリは次のようになります。

DELETE FROM table_name WHERE TranslationID IN (SELECT2); 

は、あなただけの最後のクエリでサブ選択してSELECTを挿入する必要があります。

ALTER TABLE table_name ENGINE=InnoDB; 

その後TranslationIDフィールドにUnique制約を追加します。

トップは、あなたがこのようなInnoDBエンジンにあなたのエンジンを変更することができ、将来的に重複を停止します。

+0

実際には、あなたのクエリはOPが*保持したい行を削除します*。 – Kaii

+3

@ Kaii 'すべてのダブティを識別し、そのデータ(プライマリキーを含む)をテーブルtempにコピーしました。それはありませんつまり、一時テーブルからそのIDを持つレコードを削除したいのです(一時的にすべての重複が含まれるため)。 – Ozzy

+0

有効なポイント。多分私はOPを誤解したかもしれません。 – Kaii