MySQLで重複レコードを削除したり、重複行を削除したりする必要がある場合があります。 MySQLで重複レコードを削除する方法は主に3つあります。 MySQLで重複レコードを削除する方法は次のとおりです。
MySQL重複レコードの削除
MySQLで重複レコードを削除する手順は次のとおりです。次のテーブルがあるとしますdup_orders(id、amount) レコードが重複しています。
mysql> create table dup_orders(id int, amount int); mysql> insert into dup_orders(id,amount) values(1, 100),(1,250),(2,350),(2,350); mysql> select * from dup_orders; +------+--------+ | id | amount | +------+--------+ | 1 | 100 | | 1 | 250 | | 2 | 350 | | 2 | 350 | +------+--------+
ボーナスリード:MySQLで重複レコードを取得する方法
MySQLで重複する行を削除する方法
MySQLで重複レコードを削除する3つの方法のそれぞれを見てみましょう。
1。中間テーブルを使用して重複レコードを削除する
この方法には3つのステップがあります。まず、 dup_orders から、重複のない行を選択します テーブルを作成し、それらを別のテーブルに挿入します。構文は次のとおりです。
CREATE TABLE [copy_of_source] SELECT DISTINCT [columns] FROM [source_table];
これが、dup_ordersから別のテーブルに個別の行を選択するためのクエリです。
mysql> CREATE TABLE dup_orders_copy SELECT DISTINCT id,amount FROM dup_orders; mysql> select * from dup_orders_copy; +------+--------+ | id | amount | +------+--------+ | 1 | 100 | | 1 | 250 | | 2 | 350 | +------+--------+
上記のクエリは、重複する行、つまりすべての列の重複する値を削除します。
すべてではなく1つ以上の列の値が重複している行を削除する場合は、上記のクエリでGROUPBY句を使用できます。たとえば、テーブル内のID列の値が重複している行のみが必要な場合は、次のクエリを使用します。
mysql> CREATE TABLE dup_orders_copy SELECT id,amount FROM dup_orders group by id; mysql> select * from dup_orders_copy; +------+--------+ | id | amount | +------+--------+ | 1 | 100 | | 2 | 350 | +------+--------+
中間テーブルを作成したら、元のテーブルを削除します。
mysql> drop table dup_orders;
最後に、中間テーブルの名前を元のテーブルに変更します。
mysql> alter table dup_orders_copy rename to dup_orders; mysql> select * from dup_orders; +------+--------+ | id | amount | +------+--------+ | 1 | 100 | | 2 | 350 | +------+--------+
ボーナスリード:MySQLが独自の制約を追加
2。 INNERJOINを使用して重複する行を削除します
DELETEステートメントとINNERJOINステートメントの組み合わせを使用して、重複する行を削除することもできます。ただし、この場合、テーブルには少なくとも1つの一意の列(主キーなど)が必要です。次のdup_ordersがあるとします。 金額が重複しているテーブル 値ですが一意のid 値。
mysql> insert into dup_orders(id,amount) values(1, 100),(2,250),(3,350),(4,350); mysql> select * from dup_orders; +------+--------+ | id | amount | +------+--------+ | 1 | 100 | | 2 | 250 | | 3 | 350 | | 4 | 350 | +------+--------+
INNER JOINを使用して上記のテーブルをそれ自体と結合し、次のクエリを使用して重複する行を削除できます。
mysql> DELETE t1 FROM dup_orders t1 INNER JOIN dup_orders t2 WHERE t1.id < t2.id AND t1.amount = t2.amount; +------+--------+ | id | amount | +------+--------+ | 1 | 100 | | 2 | 250 | | 4 | 350 | +------+--------+
上記のクエリは、重複する各行の行の最大IDを保持します。 IDが最小の行を保持する場合は、次のクエリを使用します。
mysql> DELETE t1 FROM dup_orders t1 INNER JOIN dup_orders t2 WHERE t1.id >> t2.id AND t1.amount = t2.amount;
ボーナス読み取り:MySQLの名前変更列
3。 ROW_NUMBER()を使用して重複レコードを削除する
8.0.2以降で使用可能なROW_NUMBER()関数を使用して、テーブルから重複レコードを削除することもできます。重複する行の行番号を取得するSQLクエリは次のとおりです
SELECT *. ROW_NUMBER () Over (PARTITION BY [column] ORDER BY [column]) as [row_number_name];
dup_ordersテーブルの行番号を取得するためのクエリは次のとおりです
SELECT *. ROW_NUMBER () Over (PARTITION BY id ORDER BY id) as row_number from dup_orders;
以下に示すように、これをSQLクエリのサブクエリとして使用して、重複する行を削除します
。DELETE FROM dup_orders WHERE id IN ( SELECT id FROM ( SELECT id, ROW_NUMBER () Over (PARTITION BY id ORDER BY id) as row_number from dup_orders ) t WHERE row_number > 1 )
うまくいけば、MySQLで重複レコードを簡単に削除できるようになりました。
Ubiqを使用すると、データを数分で簡単に視覚化し、リアルタイムのダッシュボードで監視できます。今日お試しください。