Rumah  >  Soal Jawab  >  teks badan

Bagaimana untuk mengekalkan baris X pertama dan memadamkan baris jadual

Saya sedang menyusun baris dalam lajur MySQL incident_archive 中有一个包含数百万条记录的大表,我想按 created dan mengekalkan baris X pertama dan memadamkan yang lain, apakah cara yang paling berkesan.

Setakat ini saya menghasilkan penyelesaian ini dalam Python:

def do_delete_archive(rowsToKeep):

    if rowsToKeep > 0:
        db_name = find_environment_value('DB_NAME', False, "dbname")
        db_host = find_environment_value('DB_HOST', False, "host")
        db_user = find_environment_value('DB_USER', False, "username")
        db_pass = find_environment_value('DB_PASS', False, "password")
        db = MySQLdb.connect(host=db_host,user=db_user,passwd=db_pass,db=db_name)
        cursor = db.cursor()            
        
        sql = f"""DELETE FROM `incident_archive` 
                    WHERE incident_id NOT IN 
                    ( SELECT incident_id FROM 
                    ( SELECT incident_id FROM `incident_archive` ORDER BY created DESC LIMIT {rowsToKeep}) foo) LIMIT 10000;"""
        
        try:
            rowcount = rowsToKeep+ 1
            while rowcount > rowsToKeep:
                cursor.execute(sql)
                db.commit()
                rowcount = cursor.rowcount
                print(f"--- Affected Rows: {rowcount} ---")

        except:
            db.rollback()

Masalah yang saya ada di sini ialah kaedah ini tidak akan berfungsi jika rowsToKeep 的值大于或等于 10000, apakah cara yang lebih baik untuk melakukan proses ini?

**Nota: Nilai rowsToKeep adalah dinamik, yang bermaksud ia boleh berubah.

P粉314915922P粉314915922181 hari yang lalu361

membalas semua(1)saya akan balas

  • P粉627136450

    P粉6271364502024-04-02 17:46:12

    Saya datang dengan penyelesaian berikut:

    Nota: Ambang ialah pembolehubah yang mengandungi bilangan maksimum rekod yang ingin kami simpan pada 1000 dalam contoh kami

    sqlCreate = f"""CREATE TABLE new_incident_archive LIKE incident_archive;"""
    print(f"Running query is: {sqlCreate}")
    cursor.execute(sqlCreate)
    print(f"Done with: {sqlCreate}")
    
    sqlInsert = f"""INSERT INTO new_incident_archive SELECT * FROM `incident_archive` ORDER BY created DESC LIMIT {threshold}"""
    print(f"Running query is: {sqlInsert}")
    cursor.execute(sqlInsert)
    db.commit()
    print(f"Done with: {sqlInsert}")
    
    sqlDrop = f"""DROP TABLE incident_archive"""
    print(f"Running query is: {sqlDrop}")
    cursor.execute(sqlDrop)
    print(f"Done with: {sqlDrop}")
    
    sqlRename = f"""RENAME TABLE `new_incident_archive` TO `incident_archive`;"""
    print(f"Running query is: {sqlRename}")
    cursor.execute(sqlRename)
    print(f"Done with: {sqlRename}")

    balas
    0
  • Batalbalas