4

キー名が PRIMARY、Type が BTREE、Unique が YES、Packed が NO、Column が ID、Cardinality が 728、Collat​​ion が A である 1 つの Index を持つデータベース テーブルがあります。

ページの読み込み時に実行され、MySQL データベース テーブルにエントリを追加し、データベース テーブルから重複を削除するスクリプトがあります。

以下は、重複を削除するスクリプト セクションです。

// Removes Duplicates from the MySQL Database Table

   // Removes Duplicates from the MySQL Database Table based on 'Entry_Date' field
      mysql_query("Alter IGNORE table $TableName add unique key (Entry_Date)");

   // Deletes the added index created by the Removes Duplicates function
      mysql_query("ALTER TABLE $TableName DROP INDEX Entry_Date");

上記の [重複を削除] コマンドを使用すると、追加のインデックスがテーブルに追加されます。次の行コマンドは、この追加されたインデックスを削除することを想定しています。

問題は、Removes Duplicates コマンドで作成された追加インデックスが、次の Delete added index コマンドで削除されないことがあるため、テーブルにさらにインデックスが追加されることです。これらの追加のインデックスは、追加されたインデックスを手動で削除するまで、スクリプトがデータベースに追加のデータを追加するのを防ぎます。

私の質問: この投稿の冒頭で述べた元のインデックスを除くすべてのインデックスを削除するスクリプトに追加できるコマンドまたは短い関数はありますか?

次の投稿を読みましたが、これが正しいスクリプトであるかどうかはわかりません: 単一のクエリで主キーを除くすべてのインデックスを削除する方法

4

2 に答える 2

0

私はそうは思いません、あなたができることはコピーを作成することですが、それはインデックスをコピーしません。たとえば、create table1を(select * from table_2)として作成すると、彼はコピーを作成しますが、インデックスまたはPKは作成しません。

于 2012-04-16T20:05:39.807 に答える
0

すべてのコメントの後、私は何が起こっているのかを理解していると思います。データベースでの重複を実際に許可します。何度か掃除したいだけです。問題は、それらを消去するために選択した方法が、一意のキーを作成し、IGNORE オプションを使用することであるということです。これにより、一意のキーの作成が失敗する代わりに、重複する行が削除されます。次に、一意のキーを削除して、重複する行を再度追加できるようにします。あなたの問題は、一意のキーが削除されないことがあることです。

別の方法で重複を削除することをお勧めします。テーブル名が「my_table」で、主キーが my_mey_column であると仮定すると、次のようになります。

delete from my_table where my_key_column not in (select min(my_key_column) from my_table group by Entry_Date)

編集: @a_horse_with_no_name が指摘する mysql の制限により、上記は機能しません

代わりに、次の 3 つのクエリを試してください。

create temporary table if not exists tmp_posting_data select id from posting_data where 1=2 

insert into tmp_posting_data(id) select min(id) from posting_data group by Entry_Date

delete from Posting_Data where id not in (select id FROM tmp_posting_data)

最後に、@a_horse_with_no_name で提案されているように、行を複製できるようにする必要性を再考してみてください。行を入力してから削除する代わりに、次のようにデータベースで一意のキーを作成できます。

Alter table posting_data add unique key (Entry_Date)

次に、RSS から新しいデータを挿入するときは、「挿入」の代わりに次を使用します「置換」を使用します。これにより、主キーまたは一意のインデックスで重複している場合に古い行が削除されます

replace into posting_data (......) values(.....)
于 2012-04-16T21:06:41.187 に答える