MySQLテーブルの重複を削除する方法?


158

テーブルのDELETE指定されたsidの行を複製する必要がありMySQLます。

SQLクエリでこれを行うにはどうすればよいですか?

DELETE (DUPLICATED TITLES) FROM table WHERE SID = "1"

このような何かが、私はそれを行う方法がわかりません。


あなたはそれを一度だけ行う必要がありますか、それとも常にそれを行う必要がありますか?
ビリーONeal

重複するレコードを持つレコードはすべて同じデータを持っていますか、それとも残りのフィールドは互いに異なりますか?最初のオプションがある場合は、1つを除いてすべてのレコードを削除できます。2番目のオプションがある場合は、どのレコードを保持するかをどのように決定しますか?
rael_kid 2010

@Lex最初のオプション。@ビリー私はいつもそれをする必要があります。
Ali Demirci


1
MySQLのさまざまなバージョンで、ここで変更されたことがたくさんあります。MySQLのバージョンを注意深く確認してから、ここでソリューションのいずれかのパスを実行してください。
delatbabel 2017

回答:


215

これは、新しいテーブルを作成せずに、重複を削除します

ALTER IGNORE TABLE `table_name` ADD UNIQUE (title, SID)

注:インデックスがメモリに収まる場合にのみ機能します


26
注意:これにより、最も古い重複レコードが保持され、新しいレコードが消去されます。最新の状態を維持したい場合は、でこれを行うことはできませんALTER IGNORE
Haralan Dobrev、2012

9
InnoDBでは動作しないようです。私はALTER TABLE foo ENGINE MyISAMそれを回避するために走り、エンジンを元に戻しました。
マーティン

13
MySQL> 5.5では失敗する可能性があります。その場合は、「set session old_alter_table = 1;」を使用してください。そして「set session old_alter_table = 0;」ステートメントの前後
チリトム2013


2
@delatbabel非推奨の理由は、リンク先のページに記載されています。
Barmar 2017

133

employee次の列を持つテーブルがあるとします。

employee (first_name, last_name, start_date)

列が重複している行を削除するにはfirst_name

delete
from employee using employee,
    employee e1
where employee.id > e1.id
    and employee.first_name = e1.first_name  

1
残りのレコードには、重複するグループの最大または最小IDがありますか?
Frozen Flame

残りのレコードは、削除する条件を満たさない唯一のレコードであるため、最小のIDになります
Pablo Guerrero

1
大きなテーブルではemployee、1つのインデックスの一致のためにそれ自体に対して結合するよう>であり、インデックスの1つのチェックが遅くなるようです。それがより良いのではないでしょうSELECT MAX(ID) FROM t GROUP BY uniqueし、その後JOINの完全一致にIDしますかMAX(ID)
ebyrob 2016年

1
正解です。時間を節約しました。
Nesar

56

次に、単一のものだけでなく、すべてのSIDの重複を削除します。

一時テーブル付き

CREATE TABLE table_temp AS
SELECT * FROM table GROUP BY title, SID;

DROP TABLE table;
RENAME TABLE table_temp TO table;

以来temp_table新規に作成され、それにはインデックスがありません。重複を削除した後、それらを再作成する必要があります。テーブルにあるインデックスを確認することができますSHOW INDEXES IN table

一時テーブルなし:

DELETE FROM `table` WHERE id IN (
  SELECT all_duplicates.id FROM (
    SELECT id FROM `table` WHERE (`title`, `SID`) IN (
      SELECT `title`, `SID` FROM `table` GROUP BY `title`, `SID` having count(*) > 1
    )
  ) AS all_duplicates 
  LEFT JOIN (
    SELECT id FROM `table` GROUP BY `title`, `SID` having count(*) > 1
  ) AS grouped_duplicates 
  ON all_duplicates.id = grouped_duplicates.id 
  WHERE grouped_duplicates.id IS NULL
)

4
GROUP-ingは、グループ化したフィールドの値の組み合わせごとに1つの結果行のみを生成します。そのため、重複は削除されます。
Kamil Szot

4
私は最初の方法が好きですが、ここではあまりにもエレガントです!:B
AgelessEssence 2012年

1
@fiacreあなたは一時的に外部キーチェックを無効にすることができますstackoverflow.com/questions/15501673/...あなたはまた、他のテーブルが参照行の一部を削除する危険にさらすことができますが、クエリを変更することにより、重複排除テーブルに取得されたレコードを制御することができますSELECT * FROM table GROUP BY title, SID;それはすべて、自分が何をしているのかをどれだけよく知っているかにかかっています。
カミルゾット2015

1
@ahnbizcad一時テーブルを使用できますが、その場合、データを一時テーブルから通常のテーブルにコピーして戻す必要があります。実際のテーブルを使用している場合は、重複する古いテーブルを削除し、古いテーブルの名前を複製せずに、新しいテーブルの名前を変更できます。
Kamil Szot 2016年

1
「一時テーブルなし」の方法は、しかし、MySQLの5.7.5で変更ONLY_FULL_GROUP_BYの取り扱いには注意してください最良の解決策に最も近い:dev.mysql.com/doc/refman/5.7/en/group-by-handling.html 私はこれを得ました「SELECT id」を「SELECT ANY_VALUE(id)AS id」に置き換えることで機能します
delatbabel

53

MySQLの重複する行をインプレースで削除する(ソートするタイムスタンプcolがあると想定)ウォークスルー:

テーブルを作成し、いくつかの行を挿入します。

create table penguins(foo int, bar varchar(15), baz datetime);
insert into penguins values(1, 'skipper', now());
insert into penguins values(1, 'skipper', now());
insert into penguins values(3, 'kowalski', now());
insert into penguins values(3, 'kowalski', now());
insert into penguins values(3, 'kowalski', now());
insert into penguins values(4, 'rico', now());
select * from penguins;
    +------+----------+---------------------+
    | foo  | bar      | baz                 |
    +------+----------+---------------------+
    |    1 | skipper  | 2014-08-25 14:21:54 |
    |    1 | skipper  | 2014-08-25 14:21:59 |
    |    3 | kowalski | 2014-08-25 14:22:09 |
    |    3 | kowalski | 2014-08-25 14:22:13 |
    |    3 | kowalski | 2014-08-25 14:22:15 |
    |    4 | rico     | 2014-08-25 14:22:22 |
    +------+----------+---------------------+
6 rows in set (0.00 sec)

重複箇所を削除します。

delete a
    from penguins a
    left join(
    select max(baz) maxtimestamp, foo, bar
    from penguins
    group by foo, bar) b
    on a.baz = maxtimestamp and
    a.foo = b.foo and
    a.bar = b.bar
    where b.maxtimestamp IS NULL;
Query OK, 3 rows affected (0.01 sec)
select * from penguins;
+------+----------+---------------------+
| foo  | bar      | baz                 |
+------+----------+---------------------+
|    1 | skipper  | 2014-08-25 14:21:59 |
|    3 | kowalski | 2014-08-25 14:22:15 |
|    4 | rico     | 2014-08-25 14:22:22 |
+------+----------+---------------------+
3 rows in set (0.00 sec)

完了すると、重複する行が削除され、タイムスタンプによる最後の行が保持されます。

タイムスタンプまたは一意の列を持たない方のために。

timestampソートするための、または一意のインデックス列がありませんか?あなたは退化状態に住んでいます。重複する行を削除するには、追加の手順を実行する必要があります。

ペンギンテーブルを作成して行を追加する

create table penguins(foo int, bar varchar(15)); 
insert into penguins values(1, 'skipper'); 
insert into penguins values(1, 'skipper'); 
insert into penguins values(3, 'kowalski'); 
insert into penguins values(3, 'kowalski'); 
insert into penguins values(3, 'kowalski'); 
insert into penguins values(4, 'rico'); 
select * from penguins; 
    # +------+----------+ 
    # | foo  | bar      | 
    # +------+----------+ 
    # |    1 | skipper  | 
    # |    1 | skipper  | 
    # |    3 | kowalski | 
    # |    3 | kowalski | 
    # |    3 | kowalski | 
    # |    4 | rico     | 
    # +------+----------+ 

最初のテーブルのクローンを作成し、それにコピーします。

drop table if exists penguins_copy; 
create table penguins_copy as ( SELECT foo, bar FROM penguins );  

#add an autoincrementing primary key: 
ALTER TABLE penguins_copy ADD moo int AUTO_INCREMENT PRIMARY KEY first; 

select * from penguins_copy; 
    # +-----+------+----------+ 
    # | moo | foo  | bar      | 
    # +-----+------+----------+ 
    # |   1 |    1 | skipper  | 
    # |   2 |    1 | skipper  | 
    # |   3 |    3 | kowalski | 
    # |   4 |    3 | kowalski | 
    # |   5 |    3 | kowalski | 
    # |   6 |    4 | rico     | 
    # +-----+------+----------+ 

最大集計は、新しいmooインデックスに作用します。

delete a from penguins_copy a left join( 
    select max(moo) myindex, foo, bar 
    from penguins_copy 
    group by foo, bar) b 
    on a.moo = b.myindex and 
    a.foo = b.foo and 
    a.bar = b.bar 
    where b.myindex IS NULL; 

#drop the extra column on the copied table 
alter table penguins_copy drop moo; 
select * from penguins_copy; 

#drop the first table and put the copy table back: 
drop table penguins; 
create table penguins select * from penguins_copy; 

観察とクリーンアップ

drop table penguins_copy; 
select * from penguins;
+------+----------+ 
| foo  | bar      | 
+------+----------+ 
|    1 | skipper  | 
|    3 | kowalski | 
|    4 | rico     | 
+------+----------+ 
    Elapsed: 1458.359 milliseconds 

その大きなSQL削除ステートメントは何をしているのですか?

エイリアス「a」のテーブルペンギンは、エイリアス「b」と呼ばれるテーブルペンギンのサブセットに結合されたままになります。サブセットである右側のテーブル 'b'は、列fooとbarでグループ化された最大タイムスタンプ[またはmax moo]を見つけます。これは左側のテーブル「a」と一致します。(foo、bar、baz)の左側には、テーブルのすべての行があります。右側のサブセット 'b'には(maxtimestamp、foo、bar)があり、これは最大であるものにのみ左に一致します。

その最大ではないすべての行の値maxtimestampはNULLです。これらのNULL行をフィルターで絞り込むと、fooとbarでグループ化されたすべての行のセットがあり、これは最新のタイムスタンプbazではありません。それらを削除します。

これを実行する前に、テーブルのバックアップを作成してください。

この問題がこの表で二度と発生しないようにします。

これが機能し、「重複行」が発生した場合。すごい。次に、テーブル(これらの2つの列)に新しい複合一意キーを定義して、最初から重複が追加されないようにします。

優れた免疫システムのように、不良行は挿入時にテーブルに許可されるべきではありません。後で、重複を追加するすべてのプログラムで抗議がブロードキャストされ、修正すると、この問題が再発することはありません。


6
マダガスカルの参照のために純粋に評価してください!
マイケルウィギンズ2015年

1
これは素晴らしい答えであり、素晴らしい提案であると評価されています。エリックは他のどの答えよりもうまくいきました。
ヨハン

4
注:テーブルに自動インクリメントID列がある場合、ON句はID列と一致するだけで十分です。
ebyrob 2016年

1
私は詳細な説明が好きですが...私が正しく理解している場合、この回答はタイムスタンプを使用してレコードを区別します。その意味で、レコードは重複していません。レコードを区別するためのタイムスタンプがない場合、つまり、2つ以上のレコードですべての列が同じである場合はどうなりますか?
Rsc Rsc

1
@RscRsc最大集計を適用するタイムスタンプ列または一意のインデックスがない場合は、テーブルを複製し、一意のインデックスを追加して、deleteステートメントを適用し、コピーしたテーブルを元のテーブルに置き換える必要があるようです。 。これらの指示を反映するように答えを変更しました。
Eric Leschinski、

16

この問題に自分で遭遇した後、巨大なデータベースで、他の回答のパフォーマンスに完全に感銘を受けたわけではありません。最新の重複行のみを保持し、残りを削除したい。

一時テーブルなしの1クエリステートメントでは、これは私にとって最もうまくいきました、

DELETE e.*
FROM employee e
WHERE id IN
 (SELECT id
   FROM (SELECT MIN(id) as id
          FROM employee e2
          GROUP BY first_name, last_name
          HAVING COUNT(*) > 1) x);

唯一の注意点は、クエリを複数回実行する必要があることですが、それでも、他のオプションよりもうまく機能することがわかりました。


1
実用的なソリューション!私のために働いた-2m +行のinnodbテーブルで約20秒。それを数回使用して、重複の数が多いいくつかの違反者に下がったら、手動でジョブを終了しました。
Troy Wray

1
一挙に私のために働いた、素晴らしい!
ムルワ

列の重複が2倍を超える場合は、複数回実行する必要があります
PayteR

回答に記載されている@PayteRは、「唯一の注意点は、クエリを複数回実行する必要があることです」
seaders

13

これは常に私にとってうまくいくようです:

CREATE TABLE NoDupeTable LIKE DupeTable; 
INSERT NoDupeTable SELECT * FROM DupeTable group by CommonField1,CommonFieldN;

これにより、すべての重複除外レコードと残りの非重複除外レコードで最も低いIDが保持されます。

また、削除後に重複の問題が発生しないように、次のことも実行しました。

CREATE TABLE NoDupeTable LIKE DupeTable; 
Alter table NoDupeTable Add Unique `Unique` (CommonField1,CommonField2);
INSERT IGNORE NoDupeTable SELECT * FROM DupeTable;

つまり、最初のテーブルの複製を作成し、重複させたくないフィールドに一意のインデックスを追加してから、最初に追加しようとしたときにInsert IGNORE通常どおり失敗しないという利点を持っていますInsert2つのフィールドに基づく重複レコードで、そのようなレコードは無視されます。

fwdを移動すると、これら2つのフィールドに基づく重複レコードを作成できなくなります。


1
どのレコードが実際にそれを通過させるのかを確認ORDER BYするSELECTためにが必要ではありませんNoDupeTableか?
ebyrob 2016年

@ebyrob私は、他に指示がない限り、他の基準がない場合は最も低いIDを選択すると信じています。もちろんORDER by ID Asc傷つけることはできなかったので、それでも私は私の答えを編集します。
user3649739 2017

@ebyrobごめんなさい。私の知る限り、この選択では注文は機能しません。選択の最後のOrder byは、各ペアで見つかった最小のIDで見つかった重複のみを並べ替えます。別の方法として、あなたは行うことができSelect Max(ID)、次にOrder by Max(ID)けどどうなることすべては、挿入の順序を逆です。最高のIDを取得するには、上記の順序に関係なく、より複雑なselect結合が必要になると思います。これは、より低いIDからフィールド値を取得することになるためです。
user3649739 2017

実は、私は何で何を考えているのかわかりません。あなたは間違いなくしたいと思うMAX(ID)MIN(ID)との代わりに、列名*SELECT FROM DupeTableそれ以外の場合はあなただけのものを得るでしょう、しかしID「ランダムです。実際、多くのSQLやMySQL厳格なものでさえも、GROUP BY節で指定されていない各列で集約関数を呼び出す必要があります。
ebyrob 2017

@ebyrob Max(ID)Min(ID)のテストでは、MaxまたはMindレコードのIDを返す以外は何もしません。どちらの場合も同じレコードを取得します。私はフィールドを持つ2つのレコードを持っていたので、場合ID,First,Last,Notesと、レコード1,Bob,Smith,NULL2,Bob,Smith,Arrears、その後やってSELECT *Max(ID), First,Last,Notes FROM DupeTable group by First,Last両方の異なるIDを除いて、同じレコード、1を返します。Max(ID)が返され2,Bob,Smith,NULL、Min(ID)が返され1,Bob,Smith,NULLます。ノートに「Arrears」を含む2番目のレコードを取得するには、結合が必要だと思います。
user3649739 2017年

7

以下はすべてのテーブルで機能します

CREATE TABLE `noDup` LIKE `Dup` ;
INSERT `noDup` SELECT DISTINCT * FROM `Dup` ;
DROP TABLE `Dup` ;
ALTER TABLE `noDup` RENAME `Dup` ;

6

ここに簡単な答えがあります:

delete a from target_table a left JOIN (select max(id_field) as id, field_being_repeated  
    from target_table GROUP BY field_being_repeated) b 
    on a.field_being_repeated = b.field_being_repeated
      and a.id_field = b.id_field
    where b.id_field is null;

小さなミスを除き、その良い答え、and a.id_field = b.id
Vikrant Goelさん

LEFT JOINするためにbのみ比較する必要があるb.id= a.id_fieldと仮定するとfield_idユニークな自動インクリメントIDです。そうa.field_being_repeated = b.field_being_repeated余分です。(また、b.id_fieldそれはだ、このクエリには存在しませんb.id
ebyrob

6

古いレコードを削除するためのこの作業:

delete from table where id in 
(select min(e.id)
    from (select * from table) e 
    group by column1, column2
    having count(*) > 1
); 

最新のレコードを削除するには、min(e.id)をmax(e.id)に置き換えます。


5
delete p from 
product p
inner join (
    select max(id) as id, url from product 
    group by url 
    having count(*) > 1
) unik on unik.url = p.url and unik.id != p.id;

1
上記のものよりもはるかにパフォーマンスの高いソリューションであることがわかりました
Christian Butzke

5

上記の Wernerのソリューションは、主キーの存在に関係なく機能し、テーブルを台無しにせず、将来を保証するプレーンSQLを使用し、非常に理解できるため、最も便利であると思います。

コメントで述べたように、その解決策は適切に説明されていません。だから、これは私のものです。

1)新しいブール列を追加する

alter table mytable add tokeep boolean;

2)複製された列と新しい列に制約を追加します

alter table mytable add constraint preventdupe unique (mycol1, mycol2, tokeep);

3)ブール列をtrueに設定します。これは、新しい制約のため、複製された行の1つでのみ成功します

update ignore mytable set tokeep = true;

4)tokeepとしてマークされていない行を削除する

delete from mytable where tokeep is null;

5)追加した列をドロップします

alter table mytable drop tokeep;

追加した制約を保持して、将来新しい重複が発生しないようにすることをお勧めします。


4

この手順は、テーブル内のすべての重複(複数を含む)を削除し、最後の重複を保持します。これは、各グループの最後のレコード取得の拡張です。

これが誰かに役立つことを願っています。

DROP TABLE IF EXISTS UniqueIDs;
CREATE Temporary table UniqueIDs (id Int(11));

INSERT INTO UniqueIDs
    (SELECT T1.ID FROM Table T1 LEFT JOIN Table T2 ON
    (T1.Field1 = T2.Field1 AND T1.Field2 = T2.Field2 #Comparison Fields 
    AND T1.ID < T2.ID)
    WHERE T2.ID IS NULL);

DELETE FROM Table WHERE id NOT IN (SELECT ID FROM UniqueIDs);

4

別の簡単な方法... UPDATE IGNOREを使用する:

1つ以上の列にインデックスを使用する必要があります(タイプインデックス)。(インデックスの一部ではなく)新しい一時参照列を作成します。この列では、ignore句を使用して一意をマークインします。ステップバイステップ:

一意をマークする一時参照列を追加します。

ALTER TABLE `yourtable` ADD `unique` VARCHAR(3) NOT NULL AFTER `lastcolname`;

=>これにより、テーブルに列が追加されます。

テーブルを更新し、すべてに一意のマークを付けますが、重複キーの問題により発生する可能性のあるエラーは無視してください(レコードはスキップされます)。

UPDATE IGNORE `yourtable` SET `unique` = 'Yes' WHERE 1;

=>重複レコードが一意としてマークされないことがわかります=「はい」、つまり、重複レコードの各セットの1つだけが一意としてマークされます。

一意でないものをすべて削除します。

DELETE * FROM `yourtable` WHERE `unique` <> 'Yes';

=>これにより、すべての重複レコードが削除されます。

列をドロップ...

ALTER TABLE `yourtable` DROP `unique`;

テーブルを台無しにせず、プレーンな単純なSQLを使用するため、これが最良のソリューションだと思います。1つだけ明確にする必要がuniqueあります。列は、現在複製されている列と一緒に一意制約に追加する必要があります。そうしないと、SET unique= 'Yes'が失敗しないため、全体が機能しません。
xtian 2018

uniquemysqlキーワードであることにも注意してください。したがって、(既に正しく表示されているように)バックティックが必要です。列に別の単語を使用する方が便利な場合があります。
Torsten

2

MySQLテーブルの重複を削除することは一般的な問題であり、通常、特定のニーズが伴います。誰かが興味を持っている場合は、ここ(MySQLで重複行を削除する)を参照してください。一時テーブルを使用して、信頼性が高く高速な方法でMySQLの重複を削除する方法を説明します。

Ali、あなたの場合、次のようなものを実行できます:

-- create a new temporary table
CREATE TABLE tmp_table1 LIKE table1;

-- add a unique constraint    
ALTER TABLE tmp_table1 ADD UNIQUE(sid, title);

-- scan over the table to insert entries
INSERT IGNORE INTO tmp_table1 SELECT * FROM table1 ORDER BY sid;

-- rename tables
RENAME TABLE table1 TO backup_table1, tmp_table1 TO table1;

0
delete from `table` where `table`.`SID` in 
    (
    select t.SID from table t join table t1 on t.title = t1.title  where t.SID > t1.SID
)

これにより、MySQLの一部の構成とバージョンでSQLエラー(1093)が生成されます。
ebyrob 2016年

0

@ericの答えが大好きですが、本当に大きなテーブルがある場合は機能しないようです(The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET MAX_JOIN_SIZE=# if the SELECT is okay実行しようとすると取得されます)。そのため、重複する行のみを考慮するように結合クエリを制限し、次のようになりました。

DELETE a FROM penguins a
    LEFT JOIN (SELECT COUNT(baz) AS num, MIN(baz) AS keepBaz, foo
        FROM penguins
        GROUP BY deviceId HAVING num > 1) b
        ON a.baz != b.keepBaz
        AND a.foo = b.foo
    WHERE b.foo IS NOT NULL

この場合のWHERE句により、MySQLは重複のない行を無視することができ、これが重複の最初のインスタンスである場合は無視されるため、後続の重複のみが無視されます。最初のインスタンスではなく最後のインスタンスを保持するように変更MIN(baz)MAX(baz)ます。


0

これは大きなテーブルで機能します:

 CREATE Temporary table duplicates AS select max(id) as id, url from links group by url having count(*) > 1;

 DELETE l from links l inner join duplicates ld on ld.id = l.id WHERE ld.id IS NOT NULL;

最も古い変更を削除するmax(id)にはmin(id)


0

これにより、列column_nameが主キーになり、その間すべてのエラーが無視されます。したがって、の値が重複する行を削除しますcolumn_name

ALTER IGNORE TABLE `table_name` ADD PRIMARY KEY (`column_name`);

前の回答へのコメントで述べたように、これは5.7では機能しません。
Barmar

0

これは基本的にテーブルをコピーして空にしてから、個別の値のみを元に戻すことで機能すると思いますが、大量のデータに対して実行する前にもう一度確認してください。

テーブルのカーボンコピーを作成します

oldtablenameのようなテーブルtemp_tableを作成します。temp_table select * from oldtablenameを挿入します。

元のテーブルを空にします

DELETE * oldtablenameから。

コピーされたテーブルからすべての個別の値を元のテーブルにコピーして戻します

INSERT oldtablename SELECT * from temp_table group by firstname、lastname、dob

一時テーブルを削除します。

テーブルを削除するtemp_table

区別したいaLLフィールドでグループ化する必要があります。


0
DELETE T2
FROM   table_name T1
JOIN   same_table_name T2 ON (T1.title = T2.title AND T1.ID <> T2.ID)

それはあなたの要求を機能させません、あなたはそれを改善できますか?
Samir Guiderk

0

これが私が通常重複を排除する方法です

  1. 一時的な列を追加し、好きな名前を付けます(アクティブとして参照します)
  2. 重複してはいけないと考えるフィールドでグループ化し、そのアクティブを1に設定します。グループ化では、その列の重複する値の1つだけが選択されます(重複は選択されません)。
  3. アクティブゼロのオブジェクトを削除する
  4. ドロップ列がアクティブ
  5. 必要に応じて(目的に合う場合)、これらの列に一意のインデックスを追加して、重複が再び発生しないようにします

-2

あなただけの「クリーンアップ」リストを選択するために、DISTINCT句を使用することができます(と、ここでそれを行う方法についての非常に簡単な例です)。


それはどのようにして質問に答えますか?DISTINCTあなたを使用すると、そもそも持っていたかもしれない重複についての情報が失われます。それを使用して重複を削除する方法を示すことができますか?
luk2302

-3

それらをカウントし、削除クエリに制限を追加して1つだけにしておけば機能しますか?

たとえば、2つ以上ある場合は、次のようにクエリを記述します。

DELETE FROM table WHERE SID = 1 LIMIT 1;

-5

テーブルから重複データを削除する場合、いくつかの基本的な手順があります。

  • テーブルをバックアップしてください!
  • 重複する行を見つける
  • 重複する行を削除する

これは完全なチュートリアルです:https : //blog.teamsql.io/deleting-duplicate-data-3541485b3473


一意のIDのみが異なる場合に機能しますか?Eser sadece benzersiz idfarklıise de buişeyararmı?
Andrew

デフォルトでは、ここで説明する方法は、MySQLバージョン> 5.7.5では機能しません。これは、ONLY_FULL_GROUP_BYの処理が原因です。ここを参照してください: dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
delatbabel 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.