Domanda

Sto lavorando con Python MySQL e ho bisogno di pulire una tabella nel mio database che ha 13328 righe.

Non posso creare una semplice tabella a discesa, perché questa tabella è figlio e anche padre di altre chiavi esterne figlio collegate su di essa. Se provo a eliminare la tabella, il sistema mi ha proibito. La tabella è definita con ON UPDATE CASCADE, ON DELETE CASCADE e InnoDB; L'indice primary_key per quella tabella è definito come

productID INT(6) NOT NULL AUTO_INCREMENT ...
PRIMARY KEY (productID,productNO)

Pertanto, devo solo pulire; questo ripristinerà automaticamente l'indice della chiave primaria della tabella su 1 per l'input successivo. Giusto?

Questa procedura ha funzionato bene per un'altra tabella che era una tabella padre, ma non anche una tabella padre e figlio. Ma, per questo tavolo, che è figlio e padre di altri tavoli, mi sono bloccato su di esso.

Ecco il codice - productID è la mia chiave di indice principale per questa tabella:

def clean_tableProduct(self):
    getMaxID_MySQLQuery = """SELECT MAX(productID)
    FROM product;"""

    cleanTabeMySQLQuery="""DELETE FROM product WHERE productID <=%s;"""              

    self.cursorMySQL.execute(getMaxID_MySQLQuery)        

    for row in self.cursorMySQL:       
        self.cursorMySQL.execute(cleanTabeMySQLQuery,(row[0],)) 

Se vado alla console MySQL per controllare i risultati dell'elaborazione, mi viene visualizzato:

mysql> SELECT MIN(productID)
    FROM product;
4615748

mysql> SELECT MAX(productID)
    FROM product;
4629075

Se eseguo lo stesso comando sulla console per pulire la tabella, funziona:

mysql> DELETE FROM product WHERE productID <='4629075';
Query OK, 13328 rows affected (0.64 sec)

e mi mostra cosa mi aspetterei normalmente.

Tuttavia, se vado alla funzione Python dopo aver pulito la tabella sulla console ed eseguito nuovamente il programma e pulito la tabella per riavviare l'elaborazione, riavvia l'indice della tabella non con MIN: 1, ma invece 4629076.

Qualche suggerimento?

Tutti i commenti e i suggerimenti sono molto apprezzati e benvenuti.

È stato utile?

Soluzione

Per rimuovere tutti i record dalla tabella:

truncate table product

Per reimpostare l'ID successivo su 1:

ALTER TABLE product AUTO_INCREMENT = 1

o

SET insert_id;
INSERT INTO product ...;

(Non l'ho provato. Ma dovrei funzionare)

Altri suggerimenti

Se si pulisce una tabella con troncato:

TRUNCATE TABLE product

Come effetto collaterale, questo ripristinerà il contatore dell'incremento automatico. Ma puoi anche ripristinarlo manualmente:

ALTER TABLE product AUTO_INCREMENT = 1

Grazie mille per tutti gli input e feedback rapidi. Ha fatto il trucco!

Ecco come appare ora:

def clean_tableProduct(self):
    cleanTabeMySQLQuery = """TRUNCATE TABLE product;"""
    self.cursorMySQL.execute(cleanTabeMySQLQuery)

    setIndexMySQLQuery = """ALTER TABLE product AUTO_INCREMENT = 1;"""
    self.cursorMySQL.execute(setIndexMySQLQuery)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top