sql >> データベース >  >> RDS >> Mysql

MySqlテーブルからの重複行の削除

    いくつかのオプションがあります。

    DBに作業を任せます

    一意のインデックスを使用してテーブルのコピーを作成し、ソーステーブルからテーブルにデータを挿入します。

    CREATE TABLE clean LIKE pst_nw;
    ALTER IGNORE TABLE clean ADD UNIQUE INDEX (add1, add2, add3, add4);
    INSERT IGNORE INTO clean SELECT * FROM pst_nw;
    DROP TABLE pst_nw;
    RENAME TABLE clean pst_nw;
    

    この方法の利点は、ソーステーブルを削除する前に、新しいテーブルが正しいことを確認できることです。欠点は、2倍のスペースを占有し、実行が(比較的)遅いことです。

    DBに作業を任せる#2

    次の手順を実行して、希望する結果を達成することもできます。

    set session old_alter_table=1;
    ALTER IGNORE TABLE pst_nw ADD UNIQUE INDEX (add1, add2, add3, add4);
    

    最初のコマンドは、無視フラグが無視される>

    ここでの利点は、一時テーブルをいじることがないことです。欠点は、更新を実行する前に、更新が期待どおりに機能することを確認できないことです。

    例:

     CREATE TABLE `foo` (
      `id` int(10) NOT NULL AUTO_INCREMENT,
      `one` int(10) DEFAULT NULL,
      `two` int(10) DEFAULT NULL,
      PRIMARY KEY (`id`)
    )
    
    insert into foo values (null, 1, 1);
    insert into foo values (null, 1, 1);
    insert into foo values (null, 1, 1);
    
    select * from foo;
    +----+------+------+
    | id | one  | two  |
    +----+------+------+
    |  1 |    1 |    1 |
    |  2 |    1 |    1 |
    |  3 |    1 |    1 |
    +----+------+------+
    3 row in set (0.00 sec)
    
    set session old_alter_table=1;
    ALTER IGNORE TABLE foo ADD UNIQUE INDEX (one, two);
    
    select * from foo;
    +----+------+------+
    | id | one  | two  |
    +----+------+------+
    |  1 |    1 |    1 |
    +----+------+------+
    1 row in set (0.00 sec)
    

    DBの外部でこのようなことをしないでください

    特に、データベースの外部でこのようなことを行う4,000万行の場合、膨大な時間がかかる可能性があり、まったく完了しない可能性があります。データベースにとどまるソリューションはすべて、より高速で堅牢になります。



    1. 新規インストール後にPostgresqlにログインして認証するにはどうすればよいですか?

    2. mysqlで日時フィールドにインデックスを付けるのは良い考えですか?

    3. SqlParameterはテーブル名を許可しません-SQLインジェクション攻撃のない他のオプション?

    4. グループ化されたSQL結果の各グループの最大値を持つレコードを取得します