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

複数の列の値が同じであるMySQLテーブルがある場合、最新の2つを除くすべてのエントリを削除するにはどうすればよいですか?

    これはあなたの問題の解決策かもしれません。

    ただし、日時列がないため、id列が主キーであると想定しています。そしてそれはAuto_increment 。したがって、私の仮定では、数値が大きいほど、レコードは新しいものになります。 (テーブルに古いデータダンプがない限り、これは正しいはずです)

    削除する前に必ずデータをバックアップしてください。これにより、永続的なデータが失われます。さらに良いことに、現在のテーブルのコピーを別のテーブルに作成し、新しいテーブルで作業して、以下のロジックが正しいことを確認できます。次に、以下のクエリを変更して、tbl_newから読み取ります。 代わりにtbl

    次のような方法でテーブルを複製できます

    CREATE TABLE tbl_new LIKE tbl;
    

    すべてのクエリにコメントを残しました

    DROP TEMPORARY TABLE IF EXISTS keepers1, keepers2, keepers_all;
    -- get the #1 top records
    CREATE TEMPORARY TABLE keepers1 (KEY(id)) ENGINE=MEMORY AS
    SELECT fid, bid, dec_a, varc_a, varc_b, dec_b, varc_c, MAX(id) AS id
    FROM tbl
    GROUP BY fid, bid, dec_a, varc_a, varc_b, dec_b, varc_c;
    
    -- get the #2 top records
    CREATE TEMPORARY TABLE keepers2 AS
    SELECT fid, bid, dec_a, varc_a, varc_b, dec_b, varc_c, MAX(id) AS id
    FROM tbl AS k
    WHERE NOT EXISTS (SELECT 1 FROM keepers1 WHERE id = k.id)
    GROUP BY fid, bid, dec_a, varc_a, varc_b, dec_b, varc_c;
    
    
    -- create a temp table where you have all he ids that you want to keep
    CREATE TEMPORARY TABLE keepers_all (KEY(id)) ENGINE=MEMORY AS
    SELECT id FROM keepers1
    UNION ALL
    SELECT id FROM keepers2;
    
    
    -- delete all records that you don't want to keep
    DELETE k.* FROM tbl AS k WHERE NOT EXISTS (SELECT 1 FROM keepers_all WHERE id = k.id);
    

    これが1回限りのクリーンアップジョブである場合は、コンソールからクエリを実行できるはずです。しかし、あなたが彼らを募集する仕事を探しているなら、あなたはおそらくこのコードを取り、それを手続きに入れるべきです。

    注:ここでは、パフォーマンスを向上させるためにMEMORYTEMPORARYテーブルを使用しています。 「テーブルがいっぱいです」という問題が発生する可能性があります これは、レコードが多すぎるためです。次に、セッションの値max_heap_table_sizeを

    のように増やすことができます。
    SET SESSION tmp_table_size = 1024 * 1024 * 1024 * 2; -- this will set it to 2G
    SET SESSION max_heap_table_size = 1024 * 1024 * 1024 * 2; -- this will set it to 2G
    

    これにより、現在の値がわかります

    SELECT VARIABLES LIKE 'max_heap_table_size';
    SELECT VARIABLES LIKE 'tmp_table_size';
    


    1. mysqlおよびphpPDO-接続が予期せず閉じられた場合、コミットされていないトランザクションはどうなりますか?

    2. SQLite左結合

    3. 関数とストアドプロシージャ

    4. SQL WHERE条件が等しくない?