重複値を削除し、複合主キーを課すための MySQL の Oracle の ROWID の代替手段
Oracle の ROWID は、データベース内の各行に一意の識別子を提供します。テーブル。ただし、MySQL には、ROWID に完全に相当するものはありません。
提供されたクエリの場合:
delete from my_table where rowid not in (select max(rowid) from my_table group by field1,field2)
これは、特定のカラムに基づいて重複行を削除し、主キーを課すことを目的としています。 MySQL にはさまざまなアプローチがあります。
一時テーブルと一意の識別子: を実現する 1 つの方法一時テーブルを利用することで望ましい結果が得られます。一意の行識別子 (some_row_uid など) を持つ一時テーブルを作成し、そこに目的のデータを挿入します。次に、元のテーブルと一時テーブルを結合して、重複する行を特定して削除します。
セッション変数: あるいは、セッション変数を使用して各行の実行カウントを効果的に生成することもできます。擬似ROWIDを作成します。ただし、このアプローチは、サブクエリで同じテーブルを操作するときに制限に直面する可能性があります。
一時テーブルを使用したクエリの例 (MySQL 8 構文):
CREATE TEMPORARY TABLE duplicates AS SELECT @rowid:=IF(@f1=field1 AND @f2=field2, @rowid+1, 0) as rowid, @f1:=field1 as field1, @f2:=field2 as field2, some_row_uid FROM my_table t, (SELECT @rowid:=NULL, @f1:=NULL, @f2:=NULL) as init ORDER BY field1, field2 DESC; DELETE my_table FROM my_table INNER JOIN duplicates ON my_table.some_row_uid = duplicates.some_row_uid WHERE duplicates.rowid > 0; ALTER TABLE my_table ADD PRIMARY KEY (field1, field2);
このアプローチは、次のような場合があります。一時テーブルの作成と操作により、オーバーヘッドが発生します。 1 回限りの操作の場合は、合理的な解決策が提供されるはずです。
以上がROWID を使用せずに MySQL で重複行を削除し、複合主キーを追加する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。